38

Ho letto pochi post riguardanti NaN ma non ho capito come gestirlo in Ruby on Rails. Voglio controllare un valore se è un NaN Voglio sostituirlo con Zero (0). Ho provato quanto segueruby ​​on rails come trattare con NaN

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

quando per cento ha NaN esso restituisce mi falso.

Ho fatto alcuni cambiamenti nel registratore

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

uscita

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

risposta

76

NaN è istanza di Float. Utilizzare il metodo 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 

o

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

E 'anche definito come una costante: 'Float :: NAN # => Nan' – steenslag

+0

@steenslag , Non lo sapevo. Grazie per il commento. – falsetru

+2

Se si sta lavorando con la libreria standard, 'NaN' potrebbe anche essere un'istanza di' BigDecimal'. – chipit24