Issue #10512 has been reported by Chris Heald.

----------------------------------------
Bug #10512: Time.at produces imprecise nsec values
https://bugs.ruby-lang.org/issues/10512

* Author: Chris Heald
* Status: Open
* Priority: Normal
* Assignee: 
* Category: core
* Target version: 
* ruby -v: ruby 2.2.0preview1 (2014-09-17 trunk 47616) [x86_64-linux]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
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:

    assert_equal(199, Time.at(0.0000002).nsec)

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)?



-- 
https://bugs.ruby-lang.org/