Hi all,
ruby -e 'p 310399688698392600.0.to_i'
结果怎么会得到 310399688698392576 这个结果的呢?
1.8 和 1.9 都是如此,哪位大牛能帮忙解释下?谢了
#1 楼 @ShiningRay 我觉得如果这个问题出在编译型语言身上我还能理解,出现在解释型语言身上就不能理解了,Ruby 有很多机会可以纠正结果使之完全正确的
估计 310399688698392600.0 在存储的时候,应该是以 3.10399688698392600 乘 10 的 17 次方存储的。 问题就出在前面的浮点上面了。当它还原的时候,就把后面的精度丢了。
个人觉得,这个问题我们解决不了,只能了解它并合理得利用或避开它。用浮点数的时候应该要考虑到这方面的问题的。有的问题不适合用浮点数解决。
二进制 不能完整的描述所有的小数,就像十进制不能完整的描述 1/3 一样。 这和语言没有关系,C++ C# 都有这个问题。 这和浮点数的存储机制有关。 如果需要需要精度处理 最好 用 BigDecimal。