簡體   English   中英

ruby on rails 如何處理 NaN

[英]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

NaNFloat例子。 使用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)

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM