2013-08-10 6 views
5

Я хочу проверить, есть ли число! Я попробовал следующее:Рубин проверить, если даже число, поплавок

a = 4.0 
a.is_a? Integer 

=> false 

a.even? 

=> undefined method for Float 

Так как я могу проверить, если число четное?

+0

Хорошо, в моем случае мне нужно только проверить, имеет ли номер во втором символе 5, например, в 0,5 или 3,5! –

+1

Для проверки того, существует ли 'f', вы всегда можете использовать старый добрый:' 0 <(eval '-' * f + '1') ': P – polvoazul

ответ

12

Если вы не уверены, если переменная не имеет ничего после запятой, и хотел бы, чтобы проверить перед преобразованием в целое, чтобы проверить нечетным/даже, вы могли бы сделать что-то вроде этого:

a = 4.6 
b = 4.0 

puts a%1==0 && a.to_i.even? #=> false 
puts b%1==0 && a.to_i.even? #=> true 

Кроме того, если вы хотите создать четный? метод для класса Float:

class Float 
    def even? 
    self%1==0 && self.to_i.even? 
    end 
end 

a = 4.6 
b = 4.0 

a.even? #=> false 
b.even? #=> true 
2

Сделать это Integer тогда:

a = 4.0 
a.to_i == a && a.to_i.even? #=> true 
+0

Но когда у меня есть число, равное 0,5, оно также возвращает true! –

+0

Я не думаю, что 4.2 считается четным. – atamanroman

+1

@JohnSmith Что нужно добавить к вопросу, я думал, вы имеете в виду, что это целое число типа 'Float'. –

2

Просто имейте в виду, как преобразуются номера:

(4.0).to_i # same as Integer(4.0) 
=> 4 
(4.5).to_i 
=> 4 
(4.9).to_i 
=> 4 

Использование round может быть безопаснее:

Тогда вы, конечно, может позвонить even как @Yu Hao написал (а):

(4.5).round.even? 
=> false 

Вы также можете легко соблюдать известные поплавки «особенность»:

(4.499999999999999).round.even? 
=> true 
(4.4999999999999999).round.even? 
=> false 
Смежные вопросы