仅在小数重复时设置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);

在执行1/4时,它成功地给出了结果0.25,但是当它像1/32/3这样的划分时,它会导致运行时ArithmeticException

a1a2是从用户输入实例化的。

有什么方法可以解决此问题?

您将获得BigDecimal.divide(BigDecimal)中所述的ArithmeticException - 如果确切的商没有终止的小数膨胀",因为要正确表示1/3的结果无限记忆。通过使用BigDecimal.divide(BigDecimal,int,RoundingMode),您可以明确设置您可以忍受的精度,这意味着任何分区都可以在内存中近似。

为了保持一致性,此版本的disement始终将比例设置为您指定的内容,即使值可以准确地以较少的精度来代表该值。如果不是这样,您很难理解使用该结果的任何未来计算的精确计算。

降低您的精度使用.stripTrailingZeros();这有效地将量表降低到了最小。在此过程中尽可能迟到(即在打印之前)保持我上面提到的一致性。

如果您尝试很好地显示这些值,则可能需要.toPlainString(),因为.stripTrailingZeros()单独将100显示为1E+2

最新更新