我知道我可以使用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/3
或2/3
那样进行分割时,会产生运行时ArithmeticException
。
a1
和a2
。
有什么方法可以解决这个问题吗?
答案 0 :(得分:6)
如果BigDecimal.divide(BigDecimal)
- " 中所述,如果确切的商没有终止十进制扩展&#34>,则会得到ArithmeticException
因为正确地表示1/3
的结果会占用无限的记忆。通过使用BigDecimal.divide(BigDecimal,int,RoundingMode)
,您可以明确设置您可以容忍的精度,这意味着可以在内存中近似任何除法。
为了保持一致性,此版本的除法总是将比例设置为您指定的比例,即使该值可以用较低的精度准确表示。如果它没有,那么您很难推断使用该结果的未来计算的准确程度。
降低精确度使用.stripTrailingZeros()
;这有效地将规模降低到最小。尽可能在这个过程的后期(即在你打印之前)这样做,以保持我上面提到的一致性。
如果您正在尝试很好地显示这些值,则可能还需要.toPlainString()
,因为.stripTrailingZeros()
本身会100
显示为1E+2
。