将数字与分数相乘

时间:2019-03-24 20:27:07

标签: java math floating-point division

我正在使用BigDecimals编写一些单位换算器,遇到了不得不将数字与小数-周期数相乘的情况。

在大多数情况下,精度足够好,但可以说我们有一个等式:

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

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

在没有if条件检测何时可以切割分数的情况下,是否存在一种优雅的实现方式?

2 个答案:

答案 0 :(得分:3)

以下将起作用:

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

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

答案 1 :(得分:1)

不知道这是否对您来说是一个通用的答案,但是在给定的示例中有效:

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));

不舍入将失败。