最高精度低于无限制?

时间:2013-08-07 15:13:44

标签: java

我正在使用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?

谢谢!

奥利弗

3 个答案:

答案 0 :(得分:3)

第一个问题:没有BigDecimal.UNLIMITED之类的东西。这没有任何意义。什么是小于无穷大?因为docs没有明确提到BigDecimal的默认MathContext,我必须假设它是MathContext.UNLIMITED。看到你有一个重复的小数,BigDecimal无法保持它,即使是无限精度。相反,你需要随意选择一个值(比如100或1000 - 我不知道你使用这些数字是什么)。如果您只关心第一个,比方说15个小数位,那么如果您跟踪第一个,例如100,则不应该出现舍入错误。

第二个问题:问一个单独的问题。

答案 1 :(得分:0)

BigDecimal.setScaleint为参数。所以最大可能的比例是

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的能力。