2016-08-03 157 views
2

我觉得这种行为很奇怪如何检查是否一个数组包含浮法:: NAN

> [1, 2, 3, 'a', 'b', Float::NAN].include? Float::NAN 
false 

我尝试这样做,然后找来惊讶

> Float::NAN == Float::NAN 
false 

所以,检查Float::NAN,我有诉诸

> [1, 2, 3, 'a', 'b', Float::NAN].any? { |i| i.is_a?(Float) && i.nan? } 
true 

所以,

  1. 有没有更好的方法来检查数组中的Float::NAN
  2. 为什么Float::NAN会出现这种奇怪的行为?
+0

的https: //www.ruby-forum.com/topic/6726568 –

回答

2

要检查,你可以使用:

[1, 2, 3, 'a', 'b', Float::NAN].any?{|item| item.respond_to?(:nan?) && item.nan?} 

(或try,如果你使用的Rails)

至于为什么,看看What is the rationale for all comparisons returning false for IEEE754 NaN values?

+1

优秀的答案!这会工作吗[[1,2,3,'a','b',Float :: NAN] .any? {| e | e!= e}#=> true'?也就是说,是否还有其他的'e!= 3#=> true'的其他Ruby对象'e'? –

+0

好主意,但恐怕会大大增加wtf/loc比率。 :)顺便说一句,我不知道是否有其他类以这种方式重新定义了==。 –

相关问题