以下表达式在Ruby 1.9上评估为true:
31964252037939931209 == 31964252037939933000.0
# => true
但我不知道这是怎么回事。我在这里错过了什么吗?
答案 0 :(得分:3)
解释很简单,用于在计算机上表示浮点(即十进制)数字的标准方法本质上是不准确的,并且只提供近似表示。这不是Ruby特有的;您在问题中显示的类型错误几乎出现在每种语言和每个平台上,您只需要知道它们可能会发生。
尝试将示例中的大整数值转换为浮点值可以更好地说明问题 - 您可以看到解释器无法提供精确的表示形式:
irb(main):008:0> 31964252037939931209.to_f
=> 31964252037939933000.0
维基百科的article on floating point有a more thorough discussion of accuracy problems以及其他示例。
答案 1 :(得分:1)
Ruby用于在这种比较中将bignums转换为浮点数,并且转换精度丢失了。 The issue is solved in more recent versions
答案 2 :(得分:0)
在这里,您可以看到Ruby的比较器的源代码:
http://www.ruby-doc.org/core-1.9.3/Comparable.html#method-i-3D-3D
似乎正在使用这个实际的比较器:
https://github.com/p12tic/libsimdpp/blob/master/simdpp/core/cmp_eq.h
使用这个方法似乎正在比较:
/** Compares 8-bit values for equality.
@code
r0 = (a0 == b0) ? 0xff : 0x0
...
rN = (aN == bN) ? 0xff : 0x0
@endcode
@par 256-bit version:
@icost{SSE2-AVX, NEON, ALTIVEC, 2}
*/
我的猜测可能是两个数字的值都相同。