【问题标题】:ruby on rails how to deal with NaNruby on rails 如何处理 NaN
【发布时间】:2013-10-03 08:34:44
【问题描述】:

我已经阅读了几篇关于 NaN 的帖子,但没有弄清楚如何在 Ruby on Rails 中处理它。我想检查一个值是否是NaN 我想用零(0)替换它。 我尝试了以下

logger.info(".is_a? Fixnum #{percent.is_a? Fixnum}")

当 percent 有 NaN 时,它返回 false。

我对记录器做了一些改动

logger.info("Fixnum #{percent.is_a? Fixnum} percent #{percent}")

输出

Fixnum false percent 94.44444444444444
Fixnum false percent NaN
Fixnum false percent 87.0

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-3.1


    【解决方案1】:

    NaNFloat 的实例。使用Float#nan? 方法。

    >> nan = 0.0/0 # OR nan = Float::NAN
    => NaN
    >> nan.class
    => Float
    >> nan.nan?
    => true
    >> nan.is_a?(Float) && nan.nan?
    => true
    >> (nan.is_a?(Float) && nan.nan?) ? 0 : nan
    => 0
    

    更新

    NaN could also be an instance of BigDecimal:

    ((nan.is_a?(Float) || nan.is_a?(BigDecimal)) && nan.nan?) ? 0 : nan
    

    {Float::NAN => 0, BigDecimal::NAN => 0}.fetch(nan, nan)
    

    【讨论】:

    • 也定义为常量:Float::NAN #=> Nan
    • @steenslag,我不知道。感谢您的评论。
    • 如果您使用标准库,NaN 也可以是BigDecimal 的一个实例。
    • @cornflakes24,感谢您的评论。我相应地更新了答案。
    【解决方案2】:

    @falsetru 提供的答案很有帮助,但你应该小心使用他们最后的建议:

    {Float::NAN => 0, BigDecimal::NAN => 0}.fetch(nan, nan)
    

    使用 ruby​​ 2.5 版,如果我使用他们在irb 中提供的示例:

    >> require "bigdecimal"
    => true
    >> nan = 0.0/0 # OR nan = Float::NAN
    => NaN
    >> {Float::NAN => 0, BigDecimal::NAN => 0}.fetch(nan, nan)
    => NaN
    

    您会得到NaN,而不是预期的0。我会改用他们之前的建议:

    ((nan.is_a?(Float) || nan.is_a?(BigDecimal)) && nan.nan?) ? 0 : nan
    
    >> require "bigdecimal"
    => true
    >> nan = 0.0/0 # OR nan = Float::NAN
    => NaN
    >> ((nan.is_a?(Float) || nan.is_a?(BigDecimal)) && nan.nan?) ? 0 : nan
    => 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多