我知道我可以使用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是从用户输入实例化的。
有什么办法解决这个问题吗?
发布于 2015-05-06 05:23:44
您得到了一个ArithmeticException,如BigDecimal.divide(BigDecimal)中所描述的--“如果确切的商数没有终止的十进制展开”,因为正确地表示1/3的结果将占用无限的内存。通过使用BigDecimal.divide(BigDecimal,int,RoundingMode),可以显式设置允许的精度,这意味着内存中的任何除法都可以近似。
为了保持一致性,此除法版本总是将标度设置为您指定的值,即使该值可以以较低的精度精确表示。如果没有的话,你就很难用这个结果来解释未来的计算有多精确。
要降低您的精度,请使用.stripTrailingZeros();这样可以有效地将比例降到最低。在过程中尽可能晚一点地这样做(也就是在打印之前),以保持我前面提到的一致性。
如果您想要很好地显示这些值,也可能需要.toPlainString(),因为.stripTrailingZeros()本身将显示100为1E+2。
https://stackoverflow.com/questions/30068131
复制相似问题