一个数乘以一个分数
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)
区别在于这里的操作是链式的,这样就可以解决这种情况。在您的解决方案中,需要计算除法(发生错误的地方)然后乘法,因为它作为参数传递。
我正在使用 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)
区别在于这里的操作是链式的,这样就可以解决这种情况。在您的解决方案中,需要计算除法(发生错误的地方)然后乘法,因为它作为参数传递。