为什么实际上将浮点值1.0与整数值1进行比较,返回true?
puts '1.0'.to_i
puts '1.0'.to_i == 1.0 #so 1 == 1.0 is true?
puts 1.0 == 1 #wtf?
Ruby只读取浮点值的第一部分然后短路吗? Wuld有人能够解释一些文档的链接吗?我已经完成了API,但我甚至不知道在这种情况下要寻找什么......
答案 0 :(得分:4)
==
比较值,1.0
的值在数学中等于1
,所以这并不奇怪。要比较值和类型,您可以使用eql?
:
1.0 == 1
#=> true
1.0.eql? 1
#=> false
答案 1 :(得分:1)
在Ruby中,==
是一种方法。这意味着理解它你需要查看调用它的特定类。
1 == 1.0
来电者是1
,一个Fixnum。所以你需要看看Fixnum#==。
1.0 == 1
来电者是1.0
,一个浮动。所以你需要看看Float#==。
令人惊讶的结果是==
不一定是对称的:a == b
和b == a
可以调用完全不同的方法并返回完全不同的结果。但在这种情况下,两个==
方法最终调用C函数rb_integer_float_eq
,它在比较它们之前将两个操作数转换为相同的数据类型。
答案 2 :(得分:0)
实际上已经有一个很好的答案“What's the difference between equal?, eql?, ===, and ==?”关于Ruby中的相等性,带有引用和东西。有很多方法可以比较Ruby中的相等性,每种方法都有自己的目的。
由于数学意义对您来说还不够,您可以进行不同的比较。比如,在eql?
es中大量使用Hash
来确定两个键是否相同。事实证明,1.0
和1
是不同的键!他就是我在Ruby 2.1.2的IRB中得到的:
> 1.0.eql?(1.0)
=> true
> 1.eql?(1)
=> true
> 1.eql?(1.0)
=> false
答案 3 :(得分:-1)
Ruby将==(根据需要)的操作数强制转换为相同类型,然后执行其数值的比较。这通常是您想要进行数字比较的目的。
答案 4 :(得分:-1)
大多数语言会自动增加变量类型的精度,以便对它们执行操作,例如比较,加法,乘法等。它们“通常”不会降低精度,也不会不必要地增加它。例如。 1/2 = 0,但1.0 / 2.0 = 0.5。