2016-11-10 84 views
1

在Ruby (x = 1/b * c)中做一些非常基本的小数运算。Ruby BigDecimal舍入错误

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

@AndrewLi这就是为什么我使用的BigDecimal不漂浮 –

回答

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

+0

这可能是值得链接到一些文档不在11年旧:https://ruby-doc.org/stdlib-2.3.1/libdoc/bigdecimal/rdoc/BigDecimal.html –

+0

我同意,这里发生的事情的基础知识在其他被链接的答案中解决,并且参考链接比较老化,因此您需要限制Ruby的数学小数位数工作仍然是一样的。如果您在小数点后知道一个一致的地方,您很可能可以通过BigDecimal正确计算数学运算。 –