Java BigDecimaldivAndRemainder выдает деление невозможным исключением - PullRequest
0 голосов
/ 18 марта 2019

Проверьте этот код.Это работает для числа, подобного 704, но с 705 начинает получаться ошибка невозможного деления:

import java.math.*;

public class Test {
  public static void main(String[] argv) throws Exception {
    BigDecimal totalDuration = new BigDecimal(705);

    int scale = 2;
    MathContext mc = new MathContext(scale, RoundingMode.HALF_UP);
    System.out.println(totalDuration.divideAndRemainder(new BigDecimal(5), mc));
  }
}

Я использую JDK 11.

Выдается ошибка:

Exception in thread "main" java.lang.ArithmeticException: Division impossible
    at java.base/java.math.BigDecimal.divideToIntegralValue(BigDecimal.java:1880)
    at java.base/java.math.BigDecimal.divideAndRemainder(BigDecimal.java:2012)
    at Test.main(Test.java:9)

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

Вы проверили документацию для BigDecimal.divideAndRemainder?

В ней говорится:

throws ArithmeticException , если результат неточный, но режим округления НЕОБХОДИМ,или mc.precision> 0 и результат this.divideToIntgralValue (делитель) потребует точности больше, чем цифры mc.precision.

Так что int scale = 2; просто нетДостаточно для этой операции, если вы измените ее на int scale = 3;, она прекрасно работает.

1 голос
/ 18 марта 2019

705/5 == 141, и 141 нельзя представить как 2 цифры.

В документах сказано:

ArithmeticException генерируется, если целая частьточный коэффициент требует больше, чем прецизионные цифры.

(Перефразировав Mildy)

Вам нужно иметь больше точности.Он работает, когда scale равен 3.

704 работает предположительно, потому что целая часть может быть представлена ​​в виде двух цифр: 1.4E+2.

...