SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【MySQL】小数

問題

MySQLで小数の計算すると端数が変になります?

mysql database float 小数 計算 丸め誤差

答え

▼ テーブル

カラム名
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″をどのように扱うかによります。

関連するメモ

コメント