我想设置两个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)
为什么需要舍入?如果我不想解决,请问什么是解决方案?
谢谢
您有两个BigDecimal数字,这两个数字都需要超过1000个小数位。试图将比例设置为仅有113个小数位意味着您将失去精度,因此您需要舍入。
您可以使用采用RoundingMode的setScale方法来防止异常,但不能使用舍入。
尝试使用setScale方法的roudingMode。
就像是:
BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);
舍入是必要的。
在javadoc for BigDecimal中,它表示BigDecimal
表示为(unscaledValue×10-scale),其中unscaledValue
是一个任意长整数,而scale是32位整数。
2.6 * 10-1095需要至少1096的标度才能准确表示。它不能用(任何整数)* 10-113准确表示。因此,您需要提供roundingMode
。