一般對於數字應用上,多數還是以整數為主

實際應用時,通常會先考量數字長度,並且通常都不會有問題

但是遇到與金融交易時,常常會牽涉到小數點的問題,也就是這裡要談的議題 - 定點數與浮點數

浮點數

具有小數點,插入的資料若小數點超過預設長度,則會實施四捨五入 在MySQL中,float, double( or real) 都可以用來儲存浮點數

在使用時,可能會有誤差的問題

定點數

字串形式存放數值,若插入的數值長度超過預設長度,會回報錯誤 (在SQLMode 預設情況仍會四捨五入後,插入資料)

在 MySQL 中,decimal (or numberic) 都可以用來儲存定點數

對於精確度要求較高的資料,都要使用定點數來儲存

範例

我們直接來建立一個浮點數及定點數的資料表

MariaDB [example]> CREATE TABLE float_and_decimal(flo float(10,2), deci decimal(10,2));

Query OK, 0 rows affected (0.07 sec)

接下來,插入三筆資料

MariaDB [example]>INSERT INTO float_and_decimal VALUES(0.3456, 0.3456);
MariaDB [example]>INSERT INTO float_and_decimal VALUES(0, 0);
MariaDB [example]>INSERT INTO float_and_decimal VALUES(131072.32, 131072.32);

查看結果,前兩筆資料都能符合預期,但是第三筆資料,131072.32 會因為浮點數誤差而產生差異 原因是 float 浮點數在±131072(65536×2)以內的時候,仍會保持精確,但是超出範圍就會開始有偏差 (詳細原因可以參考這裡)

MariaDB [example]> select * from float_and_decimal;
+-----------+-----------+
| flo       | deci      |
+-----------+-----------+
|      0.35 |      0.35 |
|      0.00 |      0.00 |
| 131072.31 | 131072.32 |
+-----------+-----------+
3 rows in set (0.00 sec)