第一篇文章:html
mysql> create table t1(id1 float(5,2) default null,id2 double(5,2) default null,
id3 decimal(5,2) default null );mysql
mysql> insert into t1 values(1.2345,1.2345,1.2345);
Query OK, 1 row affected, 1 warning (0.04 sec)git
mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------+
| Note | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+
1 row in set (0.00 sec)sql
實數是帶有小數部分的數字。然而,它們不僅是爲了存儲小數部分,也可使用DEClMAL 存儲比 BIGINT還大的整數。 MySQL 既支持精確類型,也支持不精確類型。FLOAT 和 DOUBLE 類型支持使用標準的浮點運算進行近似計算。若是須要知道浮點運算是怎麼計算的,則須要研究所使用的平臺的浮點數的具體實現。 服務器
DECIMAL 類型用於存儲精確的小數。在 MySQL 5.0 和更高版本, DECIMAL 類型支持精確 計算。 MySQL 4.1 以及更早版本則使用浮點運算來實現 DECIAML 的計算,這樣作會由於 精度損失致使一些奇怪的結果。在這些版本的MySQL 中,DEClMAL 只是一個"存儲類型"。網絡
由於 CPU 不支持對 DEClMAL 的直接計算,因此在 MySQL 5.0 以及更高版本中, MySQL 服務器自身實現了 DECIMAL 的高精度計算。相對而言, CPU 直接支持原生浮點計算,所 以浮點運算明顯更快。post
浮點和 DECIMAL 類型均可以指定精度。對於 DECIMAL 列,能夠指定小數點先後所容許的 最大位數。這會影響列的空間消耗。 MySQL 5.0 和更高版本在內部把定點數保存爲二進制格式:先把定點數分紅小數點前面和小數點後面兩部分,併爲它們各自分配4個字節,這4個字節最多能夠表示9個數字(nine digits)。也就是說,DECIMAL(6,3)和 DECIMAL(18,9)都將佔用9個字節(小數點自己佔一個字節)。若是還有多出來的數字,存儲須要的字節以下:ui
Leftover Digits | Number of Bytes |
---|---|
0 | 0 |
1–2 | 1 |
3–4 | 2 |
5–6 | 3 |
7–9 | 4 |
MySQL 5.0 和更高版本中的 DEClMAL 類型容許最多 65個數字。而早期的 MySQL 版本中 這個限制是254個數字,而且保存爲未壓縮的字符串(每一個數字一個字節)。然而,這些(早 期)版本實際上並不能在計算中使用這麼大的數字,由於 DECIMAL 只是一種存儲格式: 在計算中 DEClMAL 會轉換爲 DOUBLE 類型。url
有多種方法能夠指定浮點列所須要的精度,這會使得 MySQL 悄悄選擇不一樣的數據類型, 或者在存儲時對值進行取捨。這些精度定義是非標準的,因此咱們建議只指定數據類型, 不指定精度。spa
浮點類型在存儲一樣範圍的值時,一般比 DECIMAL 使用更少的空間。 FLOAT 使用 4個字 節存儲。 DOUBLE 佔用8個字節,相比 FLOAT有更高的精度和更大的範圍。和整數類型同樣, 能選擇的只是存儲類型 IMySQL 使用 DOUBLE 做爲內部浮點計算的類型。
由於須要額外的空間和計算開銷,因此應該儘可能只在對小數進行精確計算時才使用DECIMAL一一例如存儲財務數據。但在數據量比較大的時候,能夠考慮使用 BIGINT 代替DECIMAL,將須要存儲的貨幣單位根據小數的位數乘以相應的倍數便可。假設要存儲財務數據精確到萬分之一分,則能夠把全部金額乘以一百萬,而後將結果存儲在 BIGINT裏,這樣能夠同時避免浮點存儲計算不精確和 DECIMAL 精確計算代價高的問題。
第三篇文章,官方文檔
https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html