Подтвердить что ты не робот

Округление необходимо с помощью BigDecimal номеров

Я хочу установить масштаб двух BigDecimal чисел a и b. как в этом примере:

BigDecimal a = new BigDecimal("2.6E-1095");
        BigDecimal b = new BigDecimal("2.7E-1105");
        int i = 112, j=1;

        BigDecimal aa = a.setScale(i+j);
        BigDecimal bb = b.setScale(i+j);

и когда я запустил это исключение:

java.lang.ArithmeticException: Rounding necessary
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:1439)
    at java.math.BigDecimal.setScale(BigDecimal.java:2394)
    at java.math.BigDecimal.setScale(BigDecimal.java:2437)

Почему необходимо округление? если я не хочу обойти, что такое решение, пожалуйста?

Спасибо

4b9b3361

Ответ 1

У вас есть два BigDecimal числа, оба из которых требуют более 1000 знаков после запятой. Попытка установить масштаб только на 113 десятичных знаков означает, что вы потеряете точность, и поэтому вам нужно округлить.

Вы можете использовать методы setScale, которые используют RoundingMode для предотвращения исключения, но не округления.

Ответ 2

Попробуйте использовать roudingMode метода setScale.

Некоторые вещи вроде:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);

Ответ 3

Нужно округлить.

В javadoc для BigDecimal, он говорит, что BigDecimal представляется как (unscaledValue × 10 -scale), где unscaledValue - сугубо длинное целое число, а масштаб - 32-битное целое число.

2.6 * 10 -1095 требуется масштаб, равный по меньшей мере 1096, чтобы точно представлять. Он не может быть точно представлен с (любым целым числом) * 10 -113. Поэтому вам необходимо предоставить roundingMode.

Ответ 4

Я пишу простой код вроде этого:

BigDecimal d = new BigDecimal(1.2341);
BigDecimal r = d.setScale(4);
System.out.println(r);

затем получите исключение:

java.lang.ArithmeticException: Rounding necessary
    at java.math.BigDecimal.commonNeedIncrement(BigDecimal.java:4148)
    at java.math.BigDecimal.needIncrement(BigDecimal.java:4355)
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:4330)
    at java.math.BigDecimal.setScale(BigDecimal.java:2470)
    at java.math.BigDecimal.setScale(BigDecimal.java:2512)
    at com.jack.BigDecimalTest.test(BigDecimalTest.java:11)

Я очень смущен, почему он также сообщает о Rounding necessary ошибке Rounding necessary.

Спасибо