2016-07-12 5 views
1

J'essaie de vérifier si une variable que j'ai est égale à NaN dans mon application Ruby on Rails.Vérifiez si le nombre est NaN dans Ruby on Rails

J'ai vu ce answer, mais ce n'est pas vraiment utile parce que dans mon code, je veux revenir 0 si la variable est NaN et la valeur autrement:

return (average.nan ? 0 : average.round(1)) 

Le problème est que si le nombre est pas NaN je reçois cette erreur:

NoMethodError: undefined method `nan?' for 10:Fixnum 

Je ne peux pas vérifier si le numéro est une instance de flotteur parce qu'il est dans les deux cas (probablement, je calculer une moyenne). Que puis-je faire? Il est étrange seulement pour moi qu'une fonction pour vérifier si une variable est égale à NaN n'est disponible que pour les objets NaN?

+0

[ce] (http://stackoverflow.com/questions/1235863/test-if-a-string-is-basically-an-integer-in-quotes -using-ruby) peut être votre réponse. –

+0

êtes-vous à la recherche de average.nil? – nikkypx

+0

@nikkypx pour un contrôle nul cela devrait être fait 'average.to_i.nil?' –

Répondre

8

rapide est d'utiliser:

under_the_test.to_f.nan? # gives you true/false e.g.: 
123.to_f.nan? # => false 
(123/0.0).to_f.nan? #=> true 

Notez également que seuls Flotteurs ont méthode #nan? définie sur eux, c'est la raison pour laquelle j'utilise #to_f pour convertir résultat flotter en premier.

Astuce: si vous avez le calcul entier qui peuvent potentiellement diviser par zéro cela ne fonctionnera pas:

(123/0).to_f.nan? 

Parce que les deux 123 et 0 sont des nombres entiers et qui va jeter ZeroDivisionError, afin de surmonter cette question Float::NAN constante peut être utile - par exemple comme ceci:

return Float::NAN if divisor == 0 
return x/divisor 
+1

Cela a résolu mon problème mais dans ma console, ceci: (123/0.0) .to_f.nan? est égal à faux Ruby: 2.2.3p173 Rails: 4.2.5.1 – ste

+0

Votre exemple de division par zéro == NaN est une mauvaise pratique. Selon les normes définies par 'IEEE754':' 0.0/0 == Float :: NAN' et '1.0/0 == Float :: INFINITY'. Mais ruby ​​est déjà conforme à la norme, il n'est donc pas nécessaire de créer vos propres instructions 'return'. –