Почему добавление дня ко времени меняет дробную часть секунд? - PullRequest
1 голос
/ 20 января 2012
pry(main)> time = Time.now
=> 2012-01-20 00:10:44 +0000
pry(main)> (time + 4.days).to_f
=> 1327363844.9709609
pry(main)> time.to_f
=> 1327018244.970961

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Это проблема округления с плавающей запятой. Ваш номер сохраняется как число с плавающей запятой двойной точности, которое имеет точность 53 бита. 2 ^ 53 - это примерно 9 * 10 ^ 15, что дает от 15 до 16 десятичных цифр, в зависимости от точного числа, которое будет представлено.

Вы можете заметить, что эти два числа имеют 16 и 15 десятичных цифр соответственно. Вы выключены только в последнем месте. По правде говоря, точное сохраненное значение не является ни одним из этих двух десятичных чисел, а скорее чем-то, что только точно представлено в дробном двоичном виде.

2 голосов
/ 20 января 2012

Это не для меня, когда я это сделал:

a = Time.now.to_f  
=> 1327018729.22437  
b = (a + 4.days).to_f  
=> 1327364329.22437  

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

Это намного меньше секунды, то есть .0000001 дня.Учитывая, что в день есть только 86 400 секунд, это часто не проблема, хотя есть веская причина хранить даты как даты и делать арифметику дат на Ruby.

...