在 irb 中执行以下操作时:
8.0 + 63.27
产生以下结果:
=> 71.27000000000001
有谁知道这是怎么回事?
更好的是,有人知道如何纠正这个问题吗?
ruby -v
ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]
编辑:感谢有关浮点计算的文章。编程了这么多年都不知道,我觉得很愚蠢。
(删除了错误标签)
这是处理浮点值时的常见问题(不是错误) 。如果您需要准确的表示,请使用BigDecimal
(在标准库中可用)。
对于为什么会得到此结果的外行描述,请尝试为什么浮点计算如此不准确?. 对于一些真正丰富的细节,每个计算机科学家都应该知道的关于浮点运算的知识
为了缓解这些问题,请按照其他答案中的建议使用BigDecimal,或者您可以尝试使用Flt,这是一个用于 Ruby 的任意精度浮点库。
这不是错误,这是由于浮点在内部表示的方式。内部浮动使用base 2
. 由于这个原因,一个以十为基数的有限表示的数字可以在以二为基数的情况下成为周期性的。在一些计算后转换回来可以显示您所指的行为。要解决这种情况,请避免检查相等的浮点值,而是将它们与合理的 epsilon 进行比较。