Почему ActiveSupport :: TimeWithZone # to_f возвращает большую точность, чем то, что хранится в postgres? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть приложение Rails 5.2 с бэкэндом postgres.Когда я извлекаю временную метку из базы данных и преобразовываю ее в число с плавающей точкой (to_f), она должна возвращать время в секундах с долями секунды до микросекунды (поскольку наибольшая точность хранения в postgres составляет микросекунды).Вместо этого, для примерно 25% временных меток, на которые я смотрю, я получаю 7 десятичных цифр (сотых долей наносекунд) при преобразовании временных меток в плавающие.

irb(main):009:0> u.created_at.to_f
=> 1440127129.5120609

Что здесь происходит?Разве это не должно быть 1440127129.512060 или 1440127129.512061?Откуда эта дополнительная десятичная цифра?

1 Ответ

0 голосов
/ 21 февраля 2019

Поскольку * Ruby inspect, как вы видите, просто печатает значение в десятичной форме, преобразованное из внутренней сохраненной формы, которая является двоичной, и ее представление не имеет ничего общего с его внутренней точностью и абсолютно ничего не делаетс точностью значения, сохраненного в базе данных, до его импорта в экземпляр объекта Ruby.

Чтобы продемонстрировать (часть) точки, попробуйте f=0.1000; p f в консоли irb или rails.Он просто печатает «0,1», а не «0,1000».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...