【MySQL】小数
問題
MySQLで小数の計算すると端数が変になります?
答え
▼ テーブル
カラム名 | 型 |
---|---|
id | int |
test_double | double |
test_float | float |
test_decimal | decimal(10,3) |
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `test_double` double, `test_float` float, `test_decimal` decimal(10,3), PRIMARY KEY (`id`) );
▼ データ
mysql> INSERT INTO test (test_double, test_float, test_decimal) values (0.1, 0.1, 0.100); mysql> /* ↑ を10回 */ mysql> SELECT * FROM test; +----+-------------+------------+--------------+ | id | test_double | test_float | test_decimal | +----+-------------+------------+--------------+ | 1 | 0.1 | 0.1 | 0.100 | | 2 | 0.1 | 0.1 | 0.100 | | 3 | 0.1 | 0.1 | 0.100 | | 4 | 0.1 | 0.1 | 0.100 | | 5 | 0.1 | 0.1 | 0.100 | | 6 | 0.1 | 0.1 | 0.100 | | 7 | 0.1 | 0.1 | 0.100 | | 8 | 0.1 | 0.1 | 0.100 | | 9 | 0.1 | 0.1 | 0.100 | | 10 | 0.1 | 0.1 | 0.100 | +----+-------------+------------+--------------+ 10 rows in set (0.00 sec)
上記のようなデータがあるじゃろ?
( ^ω^)
⊃テーブル⊂
これを列ごとにSUMして…
( ^ω^)
≡⊃⊂≡
mysql> SELECT SUM(test_double), SUM(test_float), SUM(test_decimal) FROM test;
こうじゃ
( ^ω^;)
⊃(バラバラ)⊂
+--------------------+--------------------+-------------------+ | SUM(test_double) | SUM(test_float) | SUM(test_decimal) | +--------------------+--------------------+-------------------+ | 0.9999999999999999 | 1.0000000149011612 | 1.000 | +--------------------+--------------------+-------------------+ 1 row in set (0.00 sec)
MySQLで小数を計算したりするときにはこんなことが起きるのでご注意ください。
double, float は、10進数の小数を2進数で表した近似値になります。
なおPHPでは、
データベースから内容を取得するとき、全部文字列として取得するので、
その後、”0.1″をどのように扱うかによります。
コメント