pry(main)> time = Time.now
=> 2012-01-20 00:10:44 +0000
pry(main)> (time + 4.days).to_f
=> 1327363844.9709609
pry(main)> time.to_f
=> 1327018244.970961
问问题
194 次
2 回答
3
这是一个浮点舍入问题。您的数字存储为精度为 53 位的双精度浮点数。2^53 大约是 9*10^15 给你 15 到 16 个十进制数字,具体取决于要表示的确切数字。
您可能会注意到这两个数字分别有 16 位和 15 位十进制数字。你只在最后一个地方离开。实际上,确切的存储值既不是这两个十进制数,而是仅以小数二进制精确表示的东西。
于 2012-01-20T00:22:21.840 回答
2
当我这样做时,它不适合我:
a = Time.now.to_f
=> 1327018729.22437
b = (a + 4.days).to_f
=> 1327364329.22437
我相信这只是浮点数常见的一个小问题,您发现了一个小的精度错误。
这远远少于一秒,即一天的 0.0000001。鉴于一天只有 86,400 秒,这通常不是问题,尽管将日期存储为日期并对其进行 Ruby 日期运算是一个很好的理由。
于 2012-01-20T00:24:11.567 回答