我知道我可以使用 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);
在执行1/4
时,它成功地给出了结果0.25
,但是当它像1/3
或2/3
这样的划分时,它会导致运行时ArithmeticException
。
a1
和a2
是从用户输入实例化的。
有什么方法可以解决此问题?
您将获得BigDecimal.divide(BigDecimal)
中所述的ArithmeticException
- 如果确切的商没有终止的小数膨胀",因为要正确表示1/3
的结果无限记忆。通过使用BigDecimal.divide(BigDecimal,int,RoundingMode)
,您可以明确设置您可以忍受的精度,这意味着任何分区都可以在内存中近似。
为了保持一致性,此版本的disement始终将比例设置为您指定的内容,即使值可以准确地以较少的精度来代表该值。如果不是这样,您很难理解使用该结果的任何未来计算的精确计算。
降低您的精度使用.stripTrailingZeros()
;这有效地将量表降低到了最小。在此过程中尽可能迟到(即在打印之前)保持我上面提到的一致性。
如果您尝试很好地显示这些值,则可能需要.toPlainString()
,因为.stripTrailingZeros()
单独将100
显示为1E+2
。