我试图为某些时间戳添加毫秒数。似乎在某个地方有一些毫秒的丢失。
input: 00:00:36,040
expected: 00:00:37,040
output: 00:00:37,039
有什么想法吗?
puts Timestamp.new("00:00:36,040").add("1,000").to_string
class Timestamp
def initialize(instr)
h, m, s, l = instr.split(/[:,]/).map { |x| x.to_i }
@time = Time.at(h*3600 + m*60 + s + l*0.001 ) - Time.new.utc_offset
end
def to_string
@time.strftime("%H:%M:%S,%L")
end
end
答案 0 :(得分:4)
您可能会遇到计算中最古老的问题之一,floating point inaccuracies。
$ ruby -e 'puts 3723.004.class'
Float
$ ruby -e 'puts Time.at(3723.004).strftime("%H:%M:%S,%L")'
17:02:03,003
简单地说,像3723.004
这样的数字并不像它们看起来那样。计算机以非常不同的方式存储它们,并且在奇怪的地方会导致轻微的不准确。这些不准确性可能会增加计算结果。
要解决此问题,请尽可能坚持使用整数。 Use the two argument form of Time.at
(注意:它需要 micro 秒)。
$ ruby -e 'puts Time.at(3723, 4000).strftime("%H:%M:%S,%L")'
17:02:03,004