Определенные числа BigDecimal в Java при разделении приводят к возникновению исключения ArithmeticException

Следующий подход, чтобы разделить два BegDecimal номера работает нормально.

BigDecimal a=new BigDecimal(5);
BigDecimal b=new BigDecimal(2);
System.out.println(a.divide(b));

Выход: 2.5


Следующий же подход, однако, терпит неудачу с java.lang.ArithmeticException

BigDecimal c=new BigDecimal(361);
BigDecimal d=new BigDecimal(6);
System.out.println(c.divide(d));

Ниже приведена полная трассировка стека исключений.

Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1603)
    at currenttime.Main.main(Main.java:15)
Java Result: 1

Какое решение?

3 ответа

Решение

Один аргумент BigDecimal.Divide бросает ArithmeticException если частное является не заканчивающимся десятичным числом (361/6 - 60.1666666...):

Броски:
ArithmeticException - если точное частное не имеет завершающего десятичного разложения

Чтобы избежать этого, используйте overload со вторым RoundingMode параметр.

Т.е. вы точно указываете BigDecimal, что ожидаете от результата деления.

Вы можете, скажем, округлить до 5 десятичных знаков:

BigDecimal c=new BigDecimal(361);
BigDecimal d=new BigDecimal(6);
System.out.println(c.divide(d, 5, BigDecimal.ROUND_HALF_EVEN));

Как и ожидалось в спецификации Java. Вы не предоставили никакой шкалы, и, поскольку 361/6 = 60,1(6), она должна выдать это исключение. Если вам нужно какое-то округление, вы должны указать шкалу, означающую, сколько цифр после десятичной точки должно быть возвращено, или вы можете захотеть использовать devideAndReminder для деления с напоминанием.

Другие вопросы по тегам