2011-07-28 10 views
1

mysqlに小数点以下の値をfloatとして格納するのは悪い考えです。10進数をmysql float型で表現していますか?

例:$ 5.01の価格を商品に保存した場合、その番号の正確な浮動型表現はありません。

私は、あなたはそれを行う場合:ただし

mysql> select avg(test) from test; 
+------------------+ 
| avg(test)  | 
+------------------+ 
| 5.01000022888184 | 
+------------------+ 
1 row in set (0.00 sec) 

CREATE TABLE IF NOT EXISTS `test` (
    `test` float NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `test` (`test`) VALUES 
(5.01); 

、その後、あなたはこれで終わるだろう、そのテーブルに対してクエリ

SELECT AVG(test) 
FROM test 

を実行します次のようなフィールドを選択してください:

mysql> select * from test; 
+------+ 
| test | 
+------+ 
| 5.01 | 
+------+ 
1 row in set (0.00 sec) 

あなたは正しい額になります。

私の質問は:どのようにすることができますか?

float型で自分の値を正確に表すことができない場合は、

選択結果が5.01000022888184でも返されますか?

答えて

1

プレーン・セレクトが5.01を返す理由は、他の浮動小数点数よりも実際の値に近い最短の数値です。 MySQLは、実際の値を最も近い小数部に変換するのではなく、これを表示します。なぜなら、ほとんどの場合、ユーザはこの結果を「より正確」と認識するからです。

avg()は異なった動作をする理由は、それがdoubleを使用して計算を行うことはおそらくあり、そしてそれらのはるかがあるので5.01は、もちろんないのすべてdoubleの値よりも丸みを帯びた対float実際の値に近いです。

1

私はそれはあなたがそれを操作後、しかしであるとして、その後、

は前回(オラクル関連)を参照してくださいIEEE 754の形で使用されている数デシベルの店と同じくらい簡単だと思う質問Oracle Floats vs Number

0

本当の問題は、あなたが行うことができないということです。

SELECT * FROM `test` WHERE `test` = 5.01 

のMySQLに保存されているフロートの値は不可知ある

それは巨大なバグですが、彼らはに喜んじゃない修理する。 DecimalとDoubleにも同様の問題があります。唯一の修正は、スキーマに

ALTER TABLE `test` change `test` `test` FLOAT(10,2) 

をフィールドの正確な精度を指定することです。しかし、あなたは精度があまり指定されるだろう場所を計算する際に任意の精度を失う(例えば任意の画分)

関連する問題