【问题标题】:Check if number is NaN检查数字是否为 NaN
【发布时间】:2016-11-14 14:49:54
【问题描述】:

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

【问题讨论】:

  • this 可能是你的答案。
  • 你在寻找average.nil吗?
  • @nikkypx for nil 检查这需要完成average.to_i.nil?
  • @AAnkudovich 不,您可以在任何对象上调用 nil,nil 对象上的 to_i 将为 0,所以您的示例将是 0.nil?
  • 我明白你的意思很抱歉

标签: ruby nan


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我在寻找既不是NaN 也不是Infinity 的东西(例如,一个有限数的东西)时发现了这个答案。因此,我将在此处添加我的发现供下一个 googlers 使用。

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

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

    【讨论】:

      【解决方案3】:

      最快的方法是使用这个:

      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
      

      【讨论】:

      • 这解决了我的问题,但在我的控制台中,这个:(123/0.0).to_f.nan?等于 false Ruby:2.2.3p173 Rails:4.2.5.1
      • 除以零示例 == NaN 示例是不好的做法。根据IEEE754定义的标准:0.0 / 0 == Float::NAN1.0/0 == Float::INFINITY。但 ruby​​ 已经符合标准,因此无需手工制作自己的 return 语句。
      猜你喜欢
      • 2012-07-11
      • 2014-11-09
      • 2018-02-03
      • 1970-01-01
      • 2011-02-08
      • 2013-08-22
      • 2016-11-20
      相关资源
      最近更新 更多