Подтвердить что ты не робот

Рубин на рельсах, как бороться с NaN

Я прочитал несколько сообщений о NaN, но не понял, как с этим бороться в Ruby on Rails. Я хочу проверить значение, если это NaN Я хочу заменить его на Zero (0). Я попробовал следующее

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

когда процент имеет NaN, он возвращает false.

Я сделал несколько изменений в журнале

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

Выход

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

Ответ 1

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 также может быть экземпляром BigDecimal:

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

или

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