3

我的持续时间以毫秒为单位,精度为 420.854(420 秒和 854 毫秒)。

我想将其格式化为 (Minutes):(Seconds).(Milliseconds) 所以我尝试了这个:

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但我觉得可能有更好的方法。非常感谢关于这个主题的任何想法。

谢谢。

4

1 回答 1

6

强烈怀疑这是由于Time.at采用了二进制浮点数 - 它与时间无关。

我不是 Ruby 开发人员,但在 IEEE-754 64 位浮点类型中,最接近 421.854 的值正是

421.85399999999998499333742074668407440185546875

...所以我的猜测是该确切值被有效地截断。

(最接近的 32 位浮点值是 421.85400390625。)

如果您使用 aRational将其指定为有效的整数毫秒 ( Rational(421854, 1000)),您可能会发现它有效。或者,使用at(seconds, microseconds_with_frac)

Time.at(421, 854000).utc.strftime('%M:%S.%L')
于 2013-05-01T20:37:26.407 回答