From: David MacMahon Date: 2013-04-16T16:44:14+09:00 Subject: [ruby-core:54327] Re: [ruby-trunk - Bug #7829] Rounding error in Ruby Time I think using floor is correct when reducing the precision of time. We don't round "15:00 on Monday" to "Tuesday", it's still Monday. Likewise, we don't round "July 15, 2012" to "2013", it's still 2012. Why should we round "859999" microseconds to "860" milliseconds? It's still millisecond 859. The real problem (IMHO) is that Time treats Float values as the exact value the user intended rather than an approximation of the value they intended. Please see my other reply to this topic that crossed paths with yours. Dave On Feb 11, 2013, at 5:48 PM, drbrain (Eric Hodel) wrote: > > Issue #7829 has been updated by drbrain (Eric Hodel). > > Category changed from core to DOC > Target version changed from 1.9.3 to next minor > > Seems like %L uses floor, not rounding should be documented so I'll switch this to a DOC ticket. > ---------------------------------------- > Bug #7829: Rounding error in Ruby Time > https://bugs.ruby-lang.org/issues/7829#change-36155 > > Author: loirotte (Philippe Dosch) > Status: Open > Priority: Normal > Assignee: > Category: DOC > Target version: next minor > ruby -v: ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux] > > > Even if I know the precision errors related to the implementation of IEEE 754 floating values, I'm very surprised of: > > irb(main):001:0> Time.utc(1970,1,1,0,0,12.860).strftime("%H:%M:%S,%L") > => "00:00:12,859" > > The fact is that I obtain: > > irb(main):002:0> Time.utc( 1970, 1, 1, 0, 0, 12.860 ).subsec > => (60517119992791/70368744177664) > irb(main):003:0> Time.utc( 1970, 1, 1, 0, 0, 12.860 ).subsec.to_f > => 0.8599999999999994 > > If I well understand the precision error that is reported for the 12th or 14th digit after the comma, I don't understand why the rounding process gives an unexpected result for this value. In this case, the last significant digit of my value is impacted, and it appears to be a embarrassing behavior. For other values, the obtained result is as expected: > > irb(main):001:0> Time.utc(1970,1,1,0,0,12.880).strftime("%H:%M:%S,%L") > => "00:00:12,880" > > Moreover, this is a part of the Time class and I don't know any way to fix it in a program (and I don't know the full list of values reproducing this issue...) > > > -- > http://bugs.ruby-lang.org/ >