Ruby Time中的舍入错误

时间:2013-02-11 08:40:28

标签: ruby time rounding-error

编辑:在timev.h中出现的子秒数表示为整数而不是浮点数?

即使我知道与实现IEEE 754浮动值有关的舍入误差,我对此感到非常惊讶:

Time.utc(1970,1,1,0,0,12.860).strftime("%H:%M:%S,%L") # => "00:00:12,859"

通常,在逗号后面的第8或第10位报告精度错误,我很清楚为什么。但在这种情况下,我的值​​的最后一个有效数字受到影响,并且它似乎是比其他众所周知的精确案例中更严重的错误。而且,这是Time类的一部分,我不知道如何在程序中修复它。其他报告的舍入浮点错误有时可以通过使用不同的类来修复,但在这种情况下我没有看到任何有趣的类使用。

我的环境:

phil@eldiablo ~ % uname -a                                                                11-02-2013 09:38:49 
Linux eldiablo.loria.fr 3.5.0-23-generic #35-Ubuntu SMP Thu Jan 24 13:05:29 UTC 2013 i686 i686 i686 GNU/Linux
/home/phil
phil@eldiablo ~ % ruby -v                                                                 11-02-2013 09:38:51 
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]
编辑:那么,关于这个的两个问题:它是不是一个错误?如果我需要Time类这样的精度,如何处理这种副作用?任何想法或解决方法?

1 个答案:

答案 0 :(得分:0)

这个错误的看似苛刻来自于这样一个事实:浮动字符串被修剪而浮动没有被舍入。当你看到

Time.utc( 1970, 1, 1, 0, 0, 12.860 ).subsec
#=> ( 60517119992791 / 70368744177664 )

将其转换为float时会显示

Time.utc( 1970, 1, 1, 0, 0, 12.860 ).subsec.to_f
#=> 0.8599999999999994

您看到的行为可能被理解为错误和功能。在我看来,这应该得到纠正,以更直观的结果。在我看来,你应该去http://bugs.ruby-lang.org/并在那里报告惊喜。