gpt4 book ai didi

java - 使用 Scala BigDecimal 乘法和除法计算倒数

转载 作者:行者123 更新时间:2023-11-30 06:07:40 25 4
gpt4 key购买 nike

我们遇到了一个问题,我们将一个 bigdecimal 除以另一个 bigdecimal,并尝试通过取除数的倒数并乘以被除数来验证它。

例如,基础数学会告诉我们:a/b = a * (1/b)

更具体地说,我们正在尝试执行以下操作:6.0075/0.89 = 6.0075 * (1/0.89) = 6.75

使用 BigDecimal 来增加精度,我们可以得到第一部分:

scala> BigDecimal(6.0075) / BigDecimal(0.89)
res1: scala.math.BigDecimal = 6.75

但不是第二个:

scala> BigDecimal(6.0075) * (BigDecimal(1.00) / BigDecimal(0.89))
res2: scala.math.BigDecimal = 6.749999999999999999999999999999999

进一步挖掘,我们发现 BigDecimal(1.00)/BigDecimal(0.89) 是一个不精确的结果,Scala 的 BigDecimal 包装 Java 的 math.BigDecimal 指定 35 位小数的精度,RoundingMode 为HALF_EVEN。不幸的是,1.00/0.89 有无限多个小数位,因此直接使用 java 的 BigDecimal 也无济于事。

还有其他人遇到过这个问题吗?除了尝试重写表达式 1.00/0.89 之外,Scala 或 Java 中还有其他方法可以处理此问题吗?

谢谢!

最佳答案

无可回避的事实是,无限回归的有限表示会产生舍入误差。 (另请参阅:Is floating point math broken?)

我看到了两种可能的解决方案,但它们都不是微不足道的。

  1. 使用有理数类来表示这些值。每个值在整数积分中都会有一个分子和一个分母。您需要跟踪 GCD,但真正需要划分两个数字的唯一时间是向屏幕(或页面)发送值时。
  2. 检查每个值是否存在舍入错误(这可能最好通过对值的String 表示形式进行 RegEx 模式匹配来完成)并进行相应调整。

关于java - 使用 Scala BigDecimal 乘法和除法计算倒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41027662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com