首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只在小数重复时设置BigDecimal精度

问只在小数重复时设置BigDecimal精度
EN

Stack Overflow用户
提问于 2015-05-06 05:19:19
回答 1查看 1.1K关注 0票数 3

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

代码语言:javascript
复制
BigDecimal a1 = new BigDecimal(1);
BigDecimal a2 = new BigDecimal(3);
BigDecimal division = a1.divide(a2,5,1); //equals 0.33333

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

代码语言:javascript
复制
BigDecimal a1 = new BigDecimal(1);
BigDecimal a2 = new BigDecimal(4);
BigDecimal division = a1.divide(a2,5,1); //equals 0.25000

我如何设置除法结果,如果除法以一个精确的结果结束,它只会给出0.25的输出,而不是0.25000。

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

代码语言:javascript
复制
BigDecimal division = a1.divide(a2);

它在执行0.25时成功地给出了结果1/4,但是当它进行1/3或2/3这样的除法时,它会产生一个运行时ArithmeticException。

a1和a2是从用户输入实例化的。

有什么办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-06 05:23:44

您得到了一个ArithmeticException,如BigDecimal.divide(BigDecimal)中所描述的--“如果确切的商数没有终止的十进制展开”,因为正确地表示1/3的结果将占用无限的内存。通过使用BigDecimal.divide(BigDecimal,int,RoundingMode),可以显式设置允许的精度,这意味着内存中的任何除法都可以近似。

为了保持一致性,此除法版本总是将标度设置为您指定的值,即使该值可以以较低的精度精确表示。如果没有的话,你就很难用这个结果来解释未来的计算有多精确。

要降低您的精度,请使用.stripTrailingZeros();这样可以有效地将比例降到最低。在过程中尽可能晚一点地这样做(也就是在打印之前),以保持我前面提到的一致性。

如果您想要很好地显示这些值,也可能需要.toPlainString(),因为.stripTrailingZeros()本身将显示100为1E+2。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30068131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档