Округление необходимо с помощью 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)
Почему необходимо округление? если я не хочу обойти, что такое решение, пожалуйста?
Спасибо
Ответы
Ответ 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
.
Спасибо