gpt4 book ai didi

ruby - 导轨 : Time#to_f precision in JSON?

转载 作者:太空宇宙 更新时间:2023-11-03 16:35:00 25 4
gpt4 key购买 nike

我正在使用 Rails 3.2.1 和 Jbuilder 构建一个简单的 JSON API在 Ruby 1.8.7 上(1.9.x 在这里可能对我有帮助,但我的托管服务提供商只有 1.8.7)。

由于 API 使用者希望时间戳为 float ,我目前只是在做一个简单的 to_f关于时间属性:

json.updated_at record.updated_at.to_f #=> 1328242368.02242

但是to_f导致精度损失。当客户端请求自给定时间点以来已修改的记录时,这会导致一些问题,因为 SQL 查询会找到客户端用于引用的相同记录。 IE。当试图查找比上述示例“更新”的记录时,SQL 查询(例如 updated_at > Time.at(1328242368.02242) )返回相同的记录,因为 updated_at 的实际值比给定的时间戳更精确和小数点。

事实上,record.updated_at.usec #=> 224250.022425秒。注意额外的小数点。

因此,最佳情况下,时间戳应该是 JSON 化的,并带有 1 个额外的小数点,例如1328242368.022425,但我找不到实现它的方法。

updated_at.to_i #=> 1328242368       # seconds
updated_at.usec #=> 22425 # microseconds
updated_at.to_f #=> 1328242368.02242 # precision loss

# Hacking around `to_f` doesn't help
decimals = updated_at.usec / 1000000.0 #=> 0.022425 # yay, decimals!
updated_at.to_i + decimals #=> 1328242368.02242 # dammit!

我四处寻找设置默认浮点精度的方法,但我被难住了。有什么想法吗?

编辑:我应该补充一点,API 使用者没有运行 JavaScript,因此 float 可以具有更高的精度。添加另一个数字(十进制或其他数字)会破坏 JS 兼容性(以及 JSON 规范),因为我相信 JS float 无法处理。所以也许我需要一种完全不同的方法......

最佳答案

经过评论的讨论,最好的选择似乎是 monkeypatching ActiveSupport::JSON让它处理BigDecimalNumeric 相同小号:

class BigDecimal
def as_json(options = nil) self end #:nodoc:
def encode_json(encoder) to_s end #:nodoc:
end

这会覆盖 Rails 团队阻止序列化 BigDecimal 的决定s 在不支持十进制数的 JSON 反序列化器中被解析为 float (并失去精度)。

关于ruby - 导轨 : Time#to_f precision in JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9137515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com