我正在使用BigDecimals编写一些单位换算器,遇到了不得不将数字与小数-周期数相乘的情况。
在大多数情况下,精度足够好,但可以说我们有一个等式:
BigDecimal.valueOf(90)
.multiply(BigDecimal.valueOf(10)
.divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP))
通常这等于10,但是由于四舍五入,我们将得到9.999999 ...
在没有if条件检测何时可以切割分数的情况下,是否存在一种优雅的实现方式?
答案 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));
不舍入将失败。