如何检查数组是否包含 Float::NAN

How to check if an array contains Float::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 会出现这种奇怪的行为?

要检查,您可以使用:

[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?