Bug #10512
closedTime.at produces imprecise nsec values
Description
I'm working on improving JRuby parity with MRI, and I've found what I think is a bug in MRI and its test suite. test_time.rb, in test_at asserts:
This passes under MRI, but fails under JRuby, which produces (the correct) value of 200.
It looks like there is a precision issue in MRI which is causing this behavior:
2.2.0-preview1 :008 > Time.at(0.000000197).nsec
=> 197
2.2.0-preview1 :009 > Time.at(0.000000198).nsec
=> 197
2.2.0-preview1 :010 > Time.at(0.000000199).nsec
=> 198
2.2.0-preview1 :011 > Time.at(0.000000200).nsec
=> 199
2.2.0-preview1 :012 > Time.at(0.000000201).nsec
=> 201
First and foremost, why does MRI assert that Time.at(0.0000002).nsec == 199, rather than 200? Second, if this is not a bug, why not (so that I can make sure JRuby performs equivalently)?
Updated by akr (Akira Tanaka) almost 12 years ago
- Status changed from Open to Rejected
It is because the float value 0.0000002 is less than 0.0000002.
Time records 0.0000002 as Rational(0.0000002).
It is the most precious record according to the given argument.