仅当小数重复时才设置BigDecimal精度

时间:2015-05-06 05:19:19

标签: java precision bigdecimal

我知道我可以使用BigDecimal.divide()方法设置固定的精度:

BigDecimal a1 = new BigDecimal(1);
BigDecimal a2 = new BigDecimal(3);
BigDecimal division = a1.divide(a2,5,1); //equals 0.33333

但如果除法结果是准确的:

BigDecimal a1 = new BigDecimal(1);
BigDecimal a2 = new BigDecimal(4);
BigDecimal division = a1.divide(a2,5,1); //equals 0.25000

如何设置除法结果,如果除法以精确结果结束,则只输出0.25而不是0.25000?

我还试图通过执行以下操作来指定精度:

BigDecimal division = a1.divide(a2);

在执行0.25时成功提供结果1/4,但当它像1/32/3那样进行分割时,会产生运行时ArithmeticException

从用户输入实例化

a1a2

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:6)

如果BigDecimal.divide(BigDecimal) - " 中所述,如果确切的商没有终止十进制扩展&#34>,则会得到ArithmeticException因为正确地表示1/3的结果会占用无限的记忆。通过使用BigDecimal.divide(BigDecimal,int,RoundingMode),您可以明确设置您可以容忍的精度,这意味着可以在内存中近似任何除法。

为了保持一致性,此版本的除法总是将比例设置为您指定的比例,即使该值可以用较低的精度准确表示。如果它没有,那么您很难推断使用该结果的未来计算的准确程度。

降低精确度使用.stripTrailingZeros();这有效地将规模降低到最小。尽可能在这个过程的后期(即在你打印之前)这样做,以保持我上面提到的一致性。

如果您正在尝试很好地显示这些值,则可能还需要.toPlainString(),因为.stripTrailingZeros()本身会100显示为1E+2