38

Ich habe einige Beiträge über NaN gelesen, aber nicht herausgefunden, wie man damit in Ruby on Rails umgehen. Ich möchte einen Wert überprüfen, wenn es eine NaN ist, die ich durch Null (0) ersetzen möchte. Ich habe versucht, die folgendenRubin auf Schienen, wie man mit NaN zu tun

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

wenn Prozent NaN hat es gibt mir falsch.

ich gemacht habe einige Änderungen im Logger

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

Ausgabe

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

Antwort

76

NaN ist Instanz von Float. Verwenden Sie die Methode 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 

oder

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

Es ist auch als Konstante definiert: 'Float :: NAN # => Nan' – steenslag

+0

@steenslag Das wusste ich nicht. Danke für deinen Kommentar. – falsetru

+2

Wenn Sie mit der Standardbibliothek arbeiten, könnte 'NaN' auch eine Instanz von' BigDecimal' sein. – chipit24