一个数乘以一个分数

Multiplying a number with a fraction

我正在使用 BigDecimals 编写一些单位转换器,我 运行 遇到了我必须将数字与分数相乘的情况 - 周期数。

在大多数情况下,精度已经足够了,但假设我们有一个等式:

BigDecimal.valueOf(90)
          .multiply(BigDecimal.valueOf(10)
                              .divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP))

通常这等于 10,但是由于四舍五入,我们将得到 9.999999...

有没有一种优雅的方法可以在没有 if 条件检测何时可以削减分数的情况下实现这一点?

不知道这是否是您的一般案例答案,但它适用于给定的示例:

bd = BigDecimal.valueOf(90)
               .multiply(BigDecimal.valueOf(10))
               .divide(BigDecimal.valueOf(90));

乘以 10然后除以 90。

a * x = ax
    -   --
    z    z

您需要为有理数包含一些舍入逻辑:

bd = BigDecimal.valueOf(1)
               .multiply(BigDecimal.valueOf(1))
               .divide(BigDecimal.valueOf(3));

没有四舍五入会失败。

以下将起作用:

BigDecimal.valueOf(90)
    .multiply(BigDecimal.valueOf(10))
    .divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP)

区别在于这里的操作是链式的,这样就可以解决这种情况。在您的解决方案中,需要计算除法(发生错误的地方)然后乘法,因为它作为参数传递。