Это потому, что у Bigdecimal нет потерь, и если вы, например, поделите 1/3, это приведет к повторению десятичной дроби до бесконечности. 0.33333333 ... теоретически, если вы умножите обратно, вы получите точный результат. Но бесконечное число будет генерировать стек поверх потока, и в этом случае запускается исключение.
решение:
try {
result = n1.divide(n2);
} catch (ArithmeticException e){
Log.d("Error bigdecimal", e.toString());
result = (n1.doubleValue() / n2.doubleValue());
};
или
n1.divide(n2,RoundingMode.HALF_UP);
в этом случае ваш результат не будет обрезан округлением