一般對於數字應用上,多數還是以整數為主
實際應用時,通常會先考量數字長度,並且通常都不會有問題
但是遇到與金融交易時,常常會牽涉到小數點的問題,也就是這裡要談的議題 - 定點數與浮點數
浮點數
具有小數點,插入的資料若小數點超過預設長度,則會實施四捨五入 在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)