- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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 #=> 22425
或 0.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
让它处理BigDecimal
与 Numeric
相同小号:
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/
我觉得如果 "".to_i 和 "".to_f 为 nil 或引发异常会很自然,而且确实如此定义 nil.to_i 或 nil.to_f 对我来说意义不大。 nil.to_i #=> 0, "".to
您好,我刚刚遇到一个问题,即 ruby 的 to_f 函数给我的结果不一致。 ruby-1.9.2-head :026 > 8.45.to_f * 100 => 844.999999999999
"9.99".to_f => 999.0 这是预期的行为吗?如何将“9.99”转换为 9.99 最佳答案 您在哪个语言环境中运行?我的猜测是它正在处理“。”作为千位分隔符(在本例中恰好位于错误的位置)
我正在使用 Rails 3.2.1 和 Jbuilder 构建一个简单的 JSON API在 Ruby 1.8.7 上(1.9.x 在这里可能对我有帮助,但我的托管服务提供商只有 1.8.7)。 由于
BigDecimal 类被破坏了吗?似乎永远不会发生以下情况: 注意 a.to_f != a.to_s.to_f a.class => BigDecimal a.to_f => 18658.10729
我试图找出数字字符串与任意字符串之间的区别: '0'.to_f #=> 0.0 'hello'.to_f #=> 0.0 以上两者都返回一个Float。如果用户输入实际值 '0' 或用户输入值 'he
我看到人们使用以下代码: gets.chomp.to_i 或 gets.chomp.to_f 我不明白为什么,当这些行的结果总是与 gets 之后没有 chomp 时的结果相同。 gets.chomp
我认为 #methods 方法会列出一个类中的所有方法。为什么当我键入 String.methods.sort 时 to_i 和 to_f 没有出现? to_i 应该将字符串转换为整数,而 to_f
这对我来说很奇怪: irb(main):012:0> "100.7".to_f.modulo(1) => 0.700000000000003 为什么最后是 3? irb(main):019:0> "1
我是一名优秀的程序员,十分优秀!