【问题标题】:Why is ActiveSupport::TimeWithZone#to_f returning greater precision than what is stored in postgres?为什么 ActiveSupport::TimeWithZone#to_f 返回的精度比存储在 postgres 中的精度高?
【发布时间】:2019-02-20 21:39:27
【问题描述】:

我有一个带有 postgres 后端的 Rails 5.2 应用程序。当我从数据库中提取时间戳并将其转换为浮点数 (to_f) 时,它应该以秒为单位返回时间,小数秒到微秒(因为最高精度的 postgres 存储是微秒)。相反,对于我查看的大约 25% 的时间戳,在将时间戳转换为浮点数时,我得到 7 个十进制数字(百分之一纳秒)。

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

这里发生了什么?这不应该是1440127129.5120601440127129.512061 吗?这个额外的十进制数字来自哪里?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql


    【解决方案1】:

    因为如您所见,Ruby 的inspect 只是打印出十进制形式的值,从内部存储的形式转换为二进制,其表示与其内部精度无关,绝对无关在导入到 Ruby 对象实例之前,具有存储在数据库中的值的精度。

    为了演示(部分)这一点,请在 irb 或 rails 控制台中尝试f=0.1000; p f。它只打印“0.1”而不是“0.1000”。

    【讨论】:

    • 谢谢!这让我发疯,但这是有道理的。
    猜你喜欢
    • 2016-10-01
    • 2015-06-05
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多