48

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

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

当百分比有NaN它返回我错误。

我在记录器中做了一些更改

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

输出

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

2 回答 2

106

NaN是 的实例Float。使用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也可以是以下实例BigDecimal

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

或者

{Float::NAN => 0, BigDecimal::NAN => 0}.fetch(nan, nan)
于 2013-10-03T08:39:43.017 回答
0

@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
于 2022-01-03T16:04:18.897 回答