Ruby在某处失去了毫秒

时间:2015-05-05 18:00:52

标签: ruby

我试图为某些时间戳添加毫秒数。似乎在某个地方有一些毫秒的丢失。

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

1 个答案:

答案 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