From [this comment in the source](https://github.com/ruby/ruby/blob/trunk/time.c#L3246-L3250), and like @thomas-holmes suggested, the value returned by `#to_f` is not accurate enough for nanoseconds, and it's recommended to use `#nsec`.

In 1.8.7:

```
[35] pry(main)> t = Time.at(999999999, 999999.999)
=> Sat Sep 08 18:46:39 -0700 2001
[36] pry(main)> "%.9f" % t
=> "999999999.999999046"
[37] pry(main)> "%.9f" % Time.now
=> "1390191794.227811098"
```