Ruby会自动提升数值以进行比较吗?

时间:2014-10-22 14:39:12

标签: ruby jruby rubymine

为什么实际上将浮点值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,但我甚至不知道在这种情况下要寻找什么......

5 个答案:

答案 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 == bb == a可以调用完全不同的方法并返回完全不同的结果。但在这种情况下,两个==方法最终调用C函数rb_integer_float_eq,它在比较它们之前将两个操作数转换为相同的数据类型。

答案 2 :(得分:0)

实际上已经有一个很好的答案“What's the difference between equal?, eql?, ===, and ==?”关于Ruby中的相等性,带有引用和东西。有很多方法可以比较Ruby中的相等性,每种方法都有自己的目的。

由于数学意义对您来说还不够,您可以进行不同的比较。比如,在eql? es中大量使用Hash来确定两个键是否相同。事实证明,1.01不同的键!他就是我在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。