38

나는 NaN에 관한 글을 거의 읽지 않았지만 Ruby on Rails에서이를 처리하는 방법을 찾지 못했습니다. NaN 인 경우 값을 확인하고 싶습니다. Zero (0)로 바꾸고 싶습니다. 나는 %가 NaN이있는 경우 다음ruby ​​on rails NaN을 처리하는 방법

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

이 나 false를 반환했습니다.

내가 로거

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

출력

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

답변

76

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 could also be an instance of BigDecimal :

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

또는

{Float::NAN => 0, BigDecimal::NAN => 0}.fetch(nan, nan) 
그것은 또한 상수로 정의되어
+2

:'플로트 :: NAN # => Nan' – steenslag

+0

@steenslag , 나는 그것을 몰랐다. 의견을 주셔서 감사합니다. – falsetru

+2

표준 라이브러리로 작업하는 경우,'NaN' 또한'BigDecimal'의 인스턴스가 될 수 있습니다. – chipit24