Two*_*ist 1 ruby floating-point
我的问题的症结如下:
irb(main):001:0> "5,280".to_f
=> 5.0
Run Code Online (Sandbox Code Playgroud)
为什么Ruby会这样做?
我几乎可以理解,"5,280".to_i == 5因为,在某些语言环境中是十进制类型的分隔符,但这里的精度损失让我感到困惑,特别是因为"5.280".to_f返回5.28符合预期.
这只是一个错误吗?
Ruby版本以防万一:
$ ruby --version
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17]
Run Code Online (Sandbox Code Playgroud)
从精细的2.3.7手册(但目前的文档说同样的事情):
to_f→float
返回将前导字符解释str为浮点数的结果.超出有效数字末尾的无关字符将被忽略.如果开头没有有效数字str,则返回0.0.此方法永远不会引发异常.
所以"5,280".to_f正在做它应该做的事情.一直到(但不包括)逗号的所有内容都是有效数字,并且",280"忽略无关字符(在这种情况下).结果与调用相同'5'.to_f.
这不是一个错误,它是预期和记录的行为.这String#to_f至少是Ruby 1.8.6的行为.