在Ruby (x = 1/b * c)
中做一些非常基本的十进制数学运算。
a = BigDecimal.new("1");
b = BigDecimal.new("0.8903");
c = BigDecimal.new("0.8903");
x = a / b * c;
puts x
输出:0.9999999998379
为了排除问题,我将测试用例简化为一个小数(x = 1/b * b)
a = BigDecimal.new("1");
b = BigDecimal.new("0.8903");
x = a / b * b;
puts x
输出:0.9999999998379
然而,将原始公式重新排列为x = c / b
会给出正确答案。
a = BigDecimal.new("1");
b = BigDecimal.new("0.8903");
c = BigDecimal.new("0.8903");
x = c / b;
puts x
输出:1.0
是什么导致了这个或者这是一个BigDecimal错误?
感谢评论告诉我浮点数学有什么问题,这就是为什么我使用BigDecimal而不是浮点数,除非BigDecimal也有同样的问题?
答案 0 :(得分:1)
这与新BigDecimal对象的最大位数限制有关。
如果你使用4的限制,那么数学运算将会解决。
a = BigDecimal.new("1");
b = BigDecimal.new("0.8903");
c = BigDecimal.new("0.8903");
x = a.div(b, 4) * c;
puts x
输出:0.8903
您可以找到有关限制here
的更多信息