如何使用 BigDecimal 正确计算有理数

How to properly calculate rational by using BigDecimal

提问人:mimichaelckc 提问时间:10/20/2021 最后编辑:mimichaelckc 更新时间:10/20/2021 访问量:123

问:

当我需要使用 BigDecimal 而不损失精度时,我怎样才能得到正确的答案。

BigDecimal a = new BigDecimal(0.5);
BigDecimal b = new BigDecimal(30);
BigDecimal c = new BigDecimal(18000);

a.divide(b).multiply(c);

在这种情况下,我怎么能得到确切的 300?

谢谢!

java 精度 bigdecimal

评论

0赞 rkosegi 10/20/2021
只需重新排列方程式,因为四舍五入会失去精度c.divide(b).multiply(a) ==> 300.0
0赞 President James K. Polk 10/20/2021
或者,您可以在 github 上找到并使用其中一个 BigRational 类。

答:

2赞 bramhaag 10/20/2021 #1

为此,可以在方法中使用 MathContext 参数。divide

例如,将为您提供所需的精度(误差幅度为 )。如果不想丢失任何精度,可以使用 ,但这将导致非终止十进制扩展。a.divide(b, MathContext.DECIMAL128).multiply(c);1e-32MathContext.UNLIMITED

具体到您的情况,您还可以尝试重写方程式以防止发生任何舍入: .a / b * c = c / b * a