From: Date: April 1 2008 8:49pm Subject: Loss of float precision List-Archive: http://lists.mysql.com/plusplus/7549 Message-Id: <5AA52B773286DA4E83B1F2D034FFED3763C159@mailexchange.klausatlanta.local> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable We had problems with numbers in the 1 million range getting truncated using MySQL++, but in C++ the values were not getting truncated. Something was getting lost in the translation Doing some testing I found out the following: float f =3D 1213567.75; query.reset(); query << "insert into floattest values (" << f << ")"; // uses STL's vanilla shift conversion // generates insert into floattest values (1.21357e+006) query.execute(); query.reset(); query << "insert into floattest values (%0)"; query.parse(); f =3D 1213568.75; query.def[0U] =3D f; // uses MySQL++ ostringstream conversion, with only a precision of 7 // generates insert into floattest values (1213569) query.execute(); If I change the precision used by MySQL++ to 9 this was generated: query.def[0U] =3D f; insert into floattest values (1213568.75) Casting to double helped, too. query.def[0U] =3D (double)f; insert into floattest values (1213568.75) Below is output from a test program (copying the code from MySQL++) that prints out a float with %f and ostringstream with increasing precision. You can see 9 is a better value than 7, but higher than 9 doesn't help. Without digressing into a discussion of best datatypes, it seems like the fix is to use a precision of 9 so the C++ values get into the database unchanged. Comments? I haven't investigated SQLSS will it do the same thing? float f =3D 1213567.75; Pr printf %f ostringstream with precision of Pr 1 1213567.750000 =3D=3D 1e+006 2 1213567.750000 =3D=3D 1.2e+006 3 1213567.750000 =3D=3D 1.21e+006 4 1213567.750000 =3D=3D 1.214e+006 5 1213567.750000 =3D=3D 1.2136e+006 6 1213567.750000 =3D=3D 1.21357e+006 7 1213567.750000 =3D=3D 1213568 8 1213567.750000 =3D=3D 1213567.8 9 1213567.750000 =3D=3D 1213567.75 10 1213567.750000 =3D=3D 1213567.75 11 1213567.750000 =3D=3D 1213567.75 12 1213567.750000 =3D=3D 1213567.75 13 1213567.750000 =3D=3D 1213567.75 14 1213567.750000 =3D=3D 1213567.75 15 1213567.750000 =3D=3D 1213567.75