我使用BigDecimals编写一些单位转换器,我遇到了一种情况,我必须将一个数字乘以分数 - 周期性数字。在大多数情况下,精度已经足够好了,但假设我们有一个这样的等式:BigDecimal.valueOf(90)
.multiply(BigDecimal.valueOf(10)
.divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP))通常这等于10,但是由于四舍五入,我们将得到9.999999...有没有一种优雅的方法来实现这一点,而无需有一个if条件来检测何时可以切割分数?
2 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
以下方法将起作用:
BigDecimal.valueOf(90) .multiply(BigDecimal.valueOf(10)) .divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP)
不同之处在于,这里的操作是链接的,这允许解决这种情况。在解决方案中,需要计算除法(发生错误的地方),然后乘法,因为它是作为参数传递的。
富国沪深
TA贡献1790条经验 获得超9个赞
不知道这是否是您的一般情况答案,但它在给定的示例中起作用:
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));
如果不舍入,将失败。
添加回答
举报
0/150
提交
取消