2012-02-22 9 views
1

浮動小数点値をMySQLに格納しようとしていますが、値が乱れているようです。 :(
私はfloat(10,7)として定義され、私のフィールドを持っていると私はそれらを挿入する前に、PHPで適切に私の値を丸める:MySQLに格納された浮動小数点値が壊れています

$rndval = round($val,7) 
INSERT INTO mytable (float) VALUES ($rndval) 

しかし、私は、このような47.5206797として値を挿入すると、それは47.520679私の中として表示されますテーブル。なぜそれ?

+0

を読む価値があるかもしれない列がテーブルに定義されている方法を投稿してください。 PHPのすべての "浮動小数点数"は、他の言語の "double"と同等でなければなりません。 – paulsm4

+0

上記のように:float(10,7) – cerr

答えて

5

あなたは正確には値が必要な場合は、FLOAT(10,7)と同じ範囲を提供する正確なデータ型などDECIMAL(17,7)、としてそれを保存します。唯一のマイナス面はDECIMALが取るということです同義語よりディスク容量が多いFLOATしかし、精度が問題となる浮動小数点誤差の補正に比べて簡単です。浮動小数点数の問題の詳細については

http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html

、以下が

http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html

+0

ニース、はい、そのトリックを正確に行いました!ありがとう、サイモン! :) – cerr

+0

@cerr: 'DECIMAL(10,7)'に '-999.9999999'から' + 999.9999999'までの値しか保存できないことに注意してください。そして、MySQLの設定によっては、(例えば '1267.3') –

+0

に収まらない値を格納しようとすると奇妙なことが起こる可能性があります。私は厳密に正確であると思いますが、FLOAT(10,7)はおそらくDECIMAL(17、 7)。私は数字に自信がないので、データストレージポイントを削除します。 DECIMALは9バイト、FLOATは4バイトです。 –

関連する問題