使用ruby版本2.0.0p247或1.9.3p286
在irb控制台
9.99 * 100 = 999.0
Run Code Online (Sandbox Code Playgroud)
和
29.99 * 100 = 2999.0
Run Code Online (Sandbox Code Playgroud)
但
19.99 * 100 = 1998.9999999999998
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这里发生了什么?我知道它可能是ruby核心中的一个错误,但对于上述3个计算,逻辑肯定是一样的吗?
直接来自ruby Float文档:
Float对象使用本机架构的双精度浮点表示来表示不精确的实数.
浮点具有不同的算术并且是不精确的数字.所以你应该知道它的深奥系统.见如下:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
http://wiki.github.com/rdp/ruby_tutorials_core/ruby-talk-faq#wiki-floats_imprecise http://en.wikipedia.组织/维基/ Floating_point#Accuracy_problems
Ruby Tutorials Core的示例
Example of odd behavior:
>> (2.0-1.1) == 0.9
=> false
Run Code Online (Sandbox Code Playgroud)
为了正确计算,请确保使用BigDecimal数据类型,这对于财务内容尤其重要.
19.99.to_d * 100.0.to_d
Run Code Online (Sandbox Code Playgroud)