ruby 检查编号是否为NaN

xvw2m8pv  于 2023-02-15  发布在  Ruby
关注(0)|答案(3)|浏览(216)

我正在检查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对象可用?

ar5n3qh5

ar5n3qh51#

最快的方法是使用这个:

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来首先将result转换为float的原因。
提示:如果你的整数计算可能会被零除,这将不起作用:

(123/0).to_f.nan?

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

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

uyto3xhc2#

我在寻找既不是NaN也不是Infinity的东西(例如,一个有限的数)时找到了这个答案,因此我将把我的发现添加到这里,以供下一个谷歌人使用。
在ruby中,答案总是在搜索Float文档时输入我的期望值,然后找到finite?

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

7z5jn7bk3#

避免这类问题的最佳方法是依赖于这样一个事实,即NaN甚至不等于它自己:

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

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

相关问题