38

Przeczytałem kilka postów dotyczących NaN, ale nie wiem, jak sobie z tym poradzić w Ruby on Rails. Chcę sprawdzić wartość, jeśli jest to NaN Chcę zastąpić go wartością Zero (0). Próbowałem następującychruby ​​na szynach, jak radzić sobie z NaN

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

gdy procent ma NaN zwraca mi fałszywe.

Zrobiłem kilka zmian w rejestratorze

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

Output

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

Odpowiedz

76

NaN jest instancją Float. Użyj metody 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 

lub

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

Jest również określona jako stała: 'Float :: NAN # => Nan' – steenslag

+0

@steenslag , Nie wiedziałem o tym. Dziękuję za komentarz. – falsetru

+2

Jeśli pracujesz z biblioteką standardową, 'NaN' może być również instancją' BigDecimal'. – chipit24