为什么Ruby给出这个大精度的十进制结果



我想转换字幕时间代码:

begin="00:00:07.71" dur="00:00:03.67

至纯秒:

begin=7.1 end=11.38

我写了一个Ruby代码:

def to_sec(value)
        a = value.split(':')
        a[0].to_i*3600+a[1].to_i*60+a[2].to_f
    end

从而产生CCD_ 1。有人能告诉我为什么会发生这种事吗?有没有时间库可以进行这种转换?

将底层数据类型表示为百分之整数秒(厘秒)可能是最简单的:

     def to_csec(value) #if you had CSec < Integer this would be `def self.[](value)`
        a = value.split(':')
        #tacking on a couple zeros to each
        a[0].to_i*360000+a[1].to_i*6000+(a[2].to_f * 100).to_i
     end

你可以添加一些助手来处理持续时间,并漂亮地打印它们:

     def csec_to_s(csec) #if you had CSec < Integer, this would be `def to_sec`
        "%.2f" % (csec.to_f / 100)
     end
    class SubtitleDuration < Range
     def initialize(a,b)
        centi_a = to_csec(a)
        super(centi_a,to_csec(b) + centi_a)
     end
     def to_s
       "begin=#{csec_to_s(self.begin)} end=#{csec_to_s(self.end) }"
     end
    end

那么你的答案就是:

    puts SubtitleDuration.new("00:00:07.71", "00:00:03.67").to_s 
    #=> begin=7.71 end=11.38

这类事情几乎可以在任何编程语言中发生。这是因为浮点数是如何表示的。它们不是以小数形式存储在引擎盖下的,所以有时你会遇到这样的奇怪舍入错误。

最新更新