2015-01-02 3 views
0

Я пытаюсь написать утверждение о классе, который зависит от Rails' end_of_month, но я не могу получить его равным вновь созданный объект Time:Совпадение Rails end_of_month к времени с теми же данными

Time.new(2014, 12).end_of_month == Time.new(2014, 12, 31, 23, 59, 59) 
=> false 

Оба значения возвращают один и тот же результат с to_i:

Time.new(2014, 12).end_of_month.to_i 
=> 1420030799 
Time.new(2014, 12, 31, 23, 59, 59).to_i 
=> 1420030799 

Но с to_f результатом немного отличается:

Time.new(2014, 12).end_of_month.to_f 
=> 1420030800.0 
Time.new(2014, 12, 31, 23, 59, 59).to_f 
=> 1420030799.0 

Оба объекта сообщают о своем классе как Time. Что тут происходит? Как я могу создать объект Time, который будет соответствовать тому, что возвращается end_of_month?

ответ

0

значение с плавающей точкой не является точной

вы можете сказать, отличается от вывода рационального значения

Time.new(2014, 12, 31, 23, 59, 59).to_r 
# => (1420041599/1) 

Time.new(2014, 12).end_of_month.to_r 
# => (1420041599999999999/1000000000) 

Из Time.to_f документа

Обратите внимание, что IEEE 754 двойной не достаточно точны, чтобы представляют количество наносекунд с эпохи.

Из документа Time.to_r

Этот метод предназначен для использования, чтобы получить точное значение, представляющее наносекунд с эпохи. Вы можете использовать этот метод для преобразования времени в другую эпоху.

Когда сравнивать время, я обычно использую to_i или to_f с RSpec активом be_within(0.01).of(27.9)

Смежные вопросы