检查数字是否为 NaN
Check if number is NaN
我正在尝试检查 Rails 应用程序中我的 Ruby 中的变量是否等于 NaN。
我看到了这个 answer,但它并不是很有用,因为在我的代码中我想 return 0 如果变量是 NaN,否则是值:
return (average.nan ? 0 : average.round(1))
问题是,如果数字不是 NaN,我会得到这个错误:
NoMethodError: undefined method `nan?' for 10:Fixnum
我无法检查数字是否为 Float 实例,因为它在两种情况下都是(可能,我正在计算平均值)。
我能做什么?
仅对我来说奇怪的是,检查变量是否等于 NaN 的函数仅适用于 NaN 对象?
最快的方法是使用这个:
under_the_test.to_f.nan? # gives you true/false e.g.:
123.to_f.nan? # => false
(123/0.0).to_f.nan? #=> true
另请注意,只有浮点数定义了 #nan?
方法,这就是我使用 #to_f
以便首先将结果转换为浮点数的原因。
提示:如果您有可能被零除的整数计算,这将不起作用:
(123/0).to_f.nan?
因为 123 和 0 都是整数并且会抛出 ZeroDivisionError
,为了克服这个问题 Float::NAN
常量可能很有用 - 例如像这样:
return Float::NAN if divisor == 0
return x / divisor
我在寻找既不是 NaN
也不是 Infinity
的东西(例如,有限数的东西)时找到了这个答案。因此,我会在这里为下一个 google 员工添加我的发现。
和 ruby 一样,答案只是在搜索 Float
文档时输入我的期望,然后找到 finite?
n = 1/0.0 #=> Infinity
n.nan? #=> false
n.finite? #=> false
避免此类问题的最佳方法是依赖 NaN 甚至不等于自身这一事实:
a = 0.0/0.0
a != a
# -> True !
这可能不会成为任何其他类型的问题。
我正在尝试检查 Rails 应用程序中我的 Ruby 中的变量是否等于 NaN。
我看到了这个 answer,但它并不是很有用,因为在我的代码中我想 return 0 如果变量是 NaN,否则是值:
return (average.nan ? 0 : average.round(1))
问题是,如果数字不是 NaN,我会得到这个错误:
NoMethodError: undefined method `nan?' for 10:Fixnum
我无法检查数字是否为 Float 实例,因为它在两种情况下都是(可能,我正在计算平均值)。 我能做什么? 仅对我来说奇怪的是,检查变量是否等于 NaN 的函数仅适用于 NaN 对象?
最快的方法是使用这个:
under_the_test.to_f.nan? # gives you true/false e.g.:
123.to_f.nan? # => false
(123/0.0).to_f.nan? #=> true
另请注意,只有浮点数定义了 #nan?
方法,这就是我使用 #to_f
以便首先将结果转换为浮点数的原因。
提示:如果您有可能被零除的整数计算,这将不起作用:
(123/0).to_f.nan?
因为 123 和 0 都是整数并且会抛出 ZeroDivisionError
,为了克服这个问题 Float::NAN
常量可能很有用 - 例如像这样:
return Float::NAN if divisor == 0
return x / divisor
我在寻找既不是 NaN
也不是 Infinity
的东西(例如,有限数的东西)时找到了这个答案。因此,我会在这里为下一个 google 员工添加我的发现。
和 ruby 一样,答案只是在搜索 Float
文档时输入我的期望,然后找到 finite?
n = 1/0.0 #=> Infinity
n.nan? #=> false
n.finite? #=> false
避免此类问题的最佳方法是依赖 NaN 甚至不等于自身这一事实:
a = 0.0/0.0
a != a
# -> True !
这可能不会成为任何其他类型的问题。