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:

>=20
> Issue #7829 has been updated by drbrain (Eric Hodel).
>=20
> Category changed from core to DOC
> Target version changed from 1.9.3 to next minor
>=20
> 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
>=20
> Author: loirotte (Philippe Dosch)
> Status: Open
> Priority: Normal
> Assignee:=20
> Category: DOC
> Target version: next minor
> ruby -v: ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]
>=20
>=20
> Even if I know the precision errors related to the implementation of =
IEEE 754 floating values, I'm very surprised of:
>=20
> irb(main):001:0> Time.utc(1970,1,1,0,0,12.860).strftime("%H:%M:%S,%L")
> =3D> "00:00:12,859"
>=20
> The fact is that I obtain:
>=20
> irb(main):002:0> Time.utc( 1970, 1, 1, 0, 0, 12.860 ).subsec
> =3D> (60517119992791/70368744177664)
> irb(main):003:0> Time.utc( 1970, 1, 1, 0, 0, 12.860 ).subsec.to_f
> =3D> 0.8599999999999994
>=20
> 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:
>=20
> irb(main):001:0> Time.utc(1970,1,1,0,0,12.880).strftime("%H:%M:%S,%L")
> =3D> "00:00:12,880"
>=20
> 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...)
>=20
>=20
> --=20
> http://bugs.ruby-lang.org/
>=20