[英]ruby on rails how to deal with NaN
我讀過幾篇關於NaN
帖子,但沒有弄清楚如何在 Ruby on Rails 中處理它。 我想檢查一個值是否是NaN
我想用零(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
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.is_a?(Float) || nan.is_a?(BigDecimal)) && nan.nan?) ? 0 : nan
要么
{Float::NAN => 0, BigDecimal::NAN => 0}.fetch(nan, nan)
@falsetru 提供的答案很有幫助,但您應該小心使用他們的最后一個建議:
{Float::NAN => 0, BigDecimal::NAN => 0}.fetch(nan, nan)
使用 ruby 2.5 版,如果我使用他們在irb
提供的示例:
>> require "bigdecimal"
=> true
>> nan = 0.0/0 # OR nan = Float::NAN
=> NaN
>> {Float::NAN => 0, BigDecimal::NAN => 0}.fetch(nan, nan)
=> NaN
你得到NaN
而不是預期的0
。 我會改用他們之前的建議:
((nan.is_a?(Float) || nan.is_a?(BigDecimal)) && nan.nan?) ? 0 : nan
>> require "bigdecimal"
=> true
>> nan = 0.0/0 # OR nan = Float::NAN
=> NaN
>> ((nan.is_a?(Float) || nan.is_a?(BigDecimal)) && nan.nan?) ? 0 : nan
=> 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.