2012-01-09 12 views
0

私のデータベースに浮動小数点型のフィールド半径があり、値は0.0です。私は32.422に、この文で、それはD2の内容に値です変更PHPのsriptを通じてSQL UPDATEとSET with float numbers

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` + ".$d2." WHERE `index` = '".$index."'"); 

後、私は、同じ量の半径の値を小さくするために、別のPHPスクリプトを使用している場合:

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` - ".$d2." WHERE `index` = '".$index."'"); 

最終値は0ではありませんが、1.4988E-9 ...ほぼゼロです。

私は間違っていると誰に教えてもらえますか?

おかげで、 Direz何も悪いことはありません

+0

あなたはより良い代わりに '' float'のdouble'を使用しています。 – a1ex07

答えて

1

、あなただけの浮動小数点数の制限をseingています。

正確な値は32.422だと思います。クエリのテキスト表現からデータベースで使用される浮動小数点数に変換されると、そのデータ型を使用して表現できる最も近い数値になります。それは32.421999995662のようなもので、32.422に非常に近いものですが、正確にはそうではありません。

各浮動小数点値には、意図した値からの逸脱が含まれている可能性があります。計算を行うと、偏差が加算され、しばらくして差が表示されます。

通常、小数点の違いは表示されません。表示される数字は、妥当な桁数に丸められます。たとえば、2番目の問合せで31.422を引いた場合、1に非常に近いもの、たとえば1.00000000014988になります。これは、表示すると1.000000000に丸められます。値がゼロに近づくにつれ、丸められる偏差よりも実質的に大きな値がないため、偏差のみが表示されます。

+0

あなたの優秀な説明をありがとう! –