Gary Wright
2/13/2009 6:07:00 AM
On Feb 13, 2009, at 12:41 AM, Jeff Vogt wrote:
> I just tried this on 1.8.6. Is this a bug or am I missing something?
>
>>> a=10.12
> => 10.12
>>> (a*100).to_i
> => 1011
Ruby floating point values are stored in binary format.
10.12 (decimal) can not be represented exactly in binary:
>> sprintf("%0.50f", 10.12)
=> "10.11999999999999921840299066388979554176330566406250"
The default conversion of float to string (e.g., for output) rounds
to 6 (or maybe 7) places and truncates trailing zeros:
>> sprintf("%0.6f", a).sub(/0+\Z/,'')
=> "10.12"
Float#to_i truncates:
>> sprintf("%0.50f", 10.12 * 100 )
=> "1011.99999999999988631316227838397026062011718750000000"
>> (10.12 * 100).to_i
=> 1011