我的持续时间以毫秒为单位,精确到毫秒,420.854(420秒和854毫秒)。
我想将其格式化为(分钟):(秒)。(毫秒)所以我试过这个:
Time.at(421.854).utc.strftime('%M:%S.%L')
结果:"07:01.853"
正如你所看到的那样,它已经消失了一毫秒。
所以我进一步深入研究:
Time.at(421.854).nsec # Output: 853999999 (expected 854000000)
我相信上面的意外输出是导致问题的原因。有些数字按预期工作,例如:
Time.at(421.855).nsec # Output 855000000 as expected
有没有人对解决这个问题有任何建议,我能想到的最好的方法是用(nanoseconds.to_f / 1000000).round * 1000000
“修复”纳秒组件,但我觉得可能有更好的方法。真的很感激有关这个问题的任何想法。
感谢。
答案 0 :(得分:6)
我强烈怀疑这是由于Time.at
采用二进制浮点数 - 它与时间无关。
我不是Ruby dev,但在IEEE-754 64位浮点类型中,最接近421.854的值恰好是
421.85399999999998499333742074668407440185546875
...所以我的猜测是,确切的值正在被截断,有效。
(最近的32位浮点值为421.85400390625。)
如果您使用Rational
来将其有效地指定为整数毫秒(Rational(421854, 1000)
),您可能会发现它有效。或者,使用at(seconds, microseconds_with_frac)
:
Time.at(421, 854000).utc.strftime('%M:%S.%L')