Определенные числа 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 для деления с напоминанием.