谁能解释为什么19.99*100是1998年的红宝石?

0 floating-point

使用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个计算,逻辑肯定是一样的吗?

bjh*_*aid 5

直接来自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)


Dav*_*dge 5

为了正确计算,请确保使用BigDecimal数据类型,这对于财务内容尤其重要.

19.99.to_d * 100.0.to_d
Run Code Online (Sandbox Code Playgroud)