При использовании функции Time.at
для преобразования числа с плавающей запятой, представляющего секунды с начала эпохи (с точностью до миллисекунды), и последующего извлечения значения микросекунды, получается непоследовательная потеря точности.
Например, с использованием 1 января за каждый год, начиная с 1970 года:
ruby -e 'require("time");p (1..50).map {|offset| Time.at(Time.parse("#{1970+offset}-01-01T00:00:0.123}").to_r.numerator/1000.0).usec}'
[122999, 123000, 122999, 122999, 122999, 122999, 122999, 122999, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 123000, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999, 122999]
Основываясь на обсуждении в https://bugs.ruby-lang.org/issues/7829 - я бы ожидал, что значение в секунду будет всегда иметь потерю точности (т.е. всегда будет 122999
).