我正在使用BigDecimal进行一些计算。最近我碰到了:
java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
该问题的答案发布在此处:ArithmeticException: "Non-terminating decimal expansion; no exact representable decimal result"
这意味着,存在一些无限小数的除法,因此BigDecimal告诉我它无法准确计算结果。为避免这种情况,我必须致电BigDecimal.setScale(SOMETHING, ROUNDING_MODE);
编辑:
现在的问题是将SOMETHING设置为最大可能值。我可以使用精度低于UNLIMITED(MathContext(precision)
)的MathContext,但同样的问题出现在那里。下面需要有一个值
MathContext.UNLIMITED
...
有谁知道如何实现这一目标?
将我的第二个问题移至: Why is there no BigDecimal.setPrecision() method?
谢谢!
奥利弗
答案 0 :(得分:3)
第一个问题:没有因为docs没有明确提到BigDecimal的默认MathContext,我必须假设它是BigDecimal.UNLIMITED
之类的东西。这没有任何意义。什么是小于无穷大?MathContext.UNLIMITED
。看到你有一个重复的小数,BigDecimal
无法保持它,即使是无限精度。相反,你需要随意选择一个值(比如100或1000 - 我不知道你使用这些数字是什么)。如果您只关心第一个,比方说15个小数位,那么如果您跟踪第一个,例如100,则不应该出现舍入错误。
第二个问题:问一个单独的问题。
答案 1 :(得分:0)
BigDecimal.setScale
以int
为参数。所以最大可能的比例是
2,147,483,647
但如上所述,你不应该使用如此巨大的尺度。你正在计算的数字将消耗大量的内存而没有任何用处。计算这个数字可能需要很长时间。
答案 2 :(得分:0)
使用 unlimited precision arithmetic
(MathContext.UNLIMITED
)链接答案的一个变通办法:
BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a = new BigDecimal(a.doubleValue()/b.doubleValue(), MathContext.UNLIMITED);
System.out.println("Result => " + a);
OUTPUT:在我的64位OSX 10.6.8上使用java“1.6.0_51”
Result => 0.1739130434782608924937363781282329000532627105712890625
PS:请注意,它仍然是一种解决方法,因为我将BigDecimal
对象转换为double以进行除法,从而限制了将数字除以大于double的能力。