检查号码是否为NaN

时间:2016-07-12 11:26:34

标签: ruby nan

我正在尝试检查我所拥有的变量是否等于我的Ruby on Rails应用程序中的NaN。

我看到了这个answer,但它并没有用,因为在我的代码中,如果变量是NaN,则我想返回0,否则返回值:

 return (average.nan ? 0 : average.round(1))

问题是,如果数字不是NaN,我会收到此错误:

NoMethodError: undefined method `nan?' for 10:Fixnum

我无法检查该数字是否为Float实例,因为它在两种情况下(可能,我正在计算平均值)。 我能做什么? 仅对我来说,检查变量是否等于NaN的函数只能用于NaN对象吗?

3 个答案:

答案 0 :(得分:21)

最快的方法是使用它:

under_the_test.to_f.nan? # gives you true/false e.g.:
123.to_f.nan? # => false
(123/0.0).to_f.nan? #=> true

另请注意,只有Floats定义了#nan?方法,这就是为什么我使用#to_f将结果转换为浮动的原因。

提示:如果您有可能除以零的整数计算,则无效:

(123/0).to_f.nan? 

因为123和0都是整数而且会抛出ZeroDivisionError,为了克服这个问题,Float::NAN常量可能很有用 - 例如:

return Float::NAN if divisor == 0
return x / divisor

答案 1 :(得分:0)

我在为既不是 NaN 也不是 Infinity 的东西(例如,有限数的东西)躲避时找到了这个答案。因此,我将在这里添加我的发现以供下一个谷歌员工使用。

和 ruby​​ 一样,答案只是在搜索 Float 文档时输入我的期望,然后找到 finite?

n = 1/0.0 #=> Infinity
n.nan? #=> false
n.finite? #=> false

答案 2 :(得分:0)

避免此类问题的最佳方法是依靠 NaN 甚至不等于自身这一事实:

a = 0.0/0.0
a != a
# -> True !

这可能不会成为任何其他类型的问题。