From: Yusuke ENDOH Date: 2010-05-11T20:30:24+09:00 Subject: [ruby-core:30149] Re: [Bug #3273] Float string conversion Hi, 2010/5/11 Marc-Andre Lafortune : > For any float f, the two following conditions should hold: > (1) f.to_s.to_f == f (round trips) > (2) f.to_s.chop.to_f != f (minimal) > > The second condition is a simplification; if the string representation is in scientific notation, than the character to remove would be the one just before the "e". Also, if the string representation ends with ".0", then it is minimal. Neat formulation. > The fact is that 17 can be necessary (e.g. 0.21611564636388508 is not equal to either 0.2161156463638851 or 0.2161156463638850) and 16 can be too much (e.g. 0.5600000000000001 == 0.56), so three precisions must be checked. Interesting. 18 cannot be necessary, and 15 cannot be too much, so it is enough to try 15, 16 and 17 digits. Right? > The following patch fixes this issue for trunk (although it can probably be made nicer and/or faster). Agreed. -- Yusuke Endoh