38

我已經閱讀了幾篇關於NaN的文章,但沒有弄清楚如何在Ruby on Rails中處理它。我想檢查一個值,如果它是一個NaN我想用零(0)替換它。 我嘗試以下ruby​​ on rails如何處理NaN

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 

回答

76

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 

UPDATE

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) 
+2

它也被定義爲一個常數:'浮法:: NAN#=> Nan' – steenslag

+0

@steenslag ,我不知道。感謝您的評論。 – falsetru

+2

如果您正在使用標準庫,'NaN'也可以是'BigDecimal'的一個實例。 – chipit24