MySQL數據類型--------浮點類型實戰
1. 背景
* MySQL支持的浮點類型中有單精度類型(float), 雙精度類型(double),和高精度類型(decimal),在數字貨幣類型中推薦使用高精度類型(decimal)來進行應用.
* MySQL浮點型和定點型可以用類型名稱後加(M,D)來表示,M表示該值的總共長度,D表示小數點後面的長度,M和D又稱為精度和標度,如float(7,4)的可顯示為-999.9999,MySQL保存值時進行四舍五入,如果插入999.00009,則結果為999.0001。FLOAT和DOUBLE在不指定精度時,默認會按照實際的精度來顯示,而DECIMAL在不指定精度時,默認整數為10,小數為0。
2. 整數類型所需的存儲和值範圍
類型 | 占用空間 | 精度 | 精確性 |
FLOAT | 4 | 單精度 | 精確到小數點後7位小數 |
DOUBLE | 8 | 雙精度 | 精確到小數點後15位小數 |
DECIMAL | 變長 | 高精度 | 精確到小數點後65位小數 |
3. 浮點數應用中的 M / G * G (!=|=)(不一定等於) M
M = 3.1415 G = 2.1542,統一精確到小數點後6位
* 單精度(float)應用
* 創建float_test 表
mysql> CREATE TABLE float_test( -> m FLOAT(10,6), -> g FLOAT(10,6) -> )ENGINE=INNODB CHARSET=utf8mb4; Query OK, 0 rows affected (0.06 sec)
* 插入 m 與 g 的數據
mysql> INSERT INTO float_test SELECT 3.1415,2.1542; Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from float_test; +----------+----------+ | m | g | +----------+----------+ | 3.141500 | 2.154200 | +----------+----------+ 1 row in set (0.00 sec)
* 進行 M / G * G 運算
mysql> SELECT m / g * g, m FROM float_test; +--------------+----------+ | m / g * g | m | +--------------+----------+ | 3.1414999962 | 3.141500 | +--------------+----------+ 1 row in set (0.00 sec)
* 雙精度(double)應用
* 創建double_test 表
mysql> CREATE TABLE double_test( -> m DOUBLE(10,6), -> g DOUBLE(10,6) -> )ENGINE=INNODB CHARSET=utf8mb4; Query OK, 0 rows affected (0.08 sec)
* 插入 m 與 g 的數據
mysql> INSERT INTO double_test SELECT 3.1415,2.1542; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from double_test; +----------+----------+ | m | g | +----------+----------+ | 3.141500 | 2.154200 | +----------+----------+ 1 row in set (0.00 sec)
* 進行 M / G * G 運算
mysql> SELECT m / g * g, m FROM double_test; +--------------+----------+ | m / g * g | m | +--------------+----------+ | 3.1415000000 | 3.141500 | +--------------+----------+ 1 row in set (0.01 sec)
* 高精度(decimal)應用
* 創建decimal_test 表
mysql> CREATE TABLE decimal_test( -> m DECIMAL(10,6), -> g DECIMAL(10,6) -> )ENGINE=INNODB CHARSET=utf8mb4; Query OK, 0 rows affected (0.05 sec)
* 插入 m 與 g 的數據
mysql> INSERT INTO decimal_test SELECT 3.1415,2.1542; Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM decimal_test; +----------+----------+ | m | g | +----------+----------+ | 3.141500 | 2.154200 | +----------+----------+ 1 row in set (0.00 sec)
* 進行 M / G * G 運算
mysql> SELECT m / g * g, m FROM decimal_test; +--------------------+----------+ | m / g * g | m | +--------------------+----------+ | 3.1415000000000000 | 3.141500 | +--------------------+----------+ 1 row in set (0.00 sec)
4. 浮點類型應用總結
* 浮點數如果不寫精度和標度,則會按照實際顯示
* 如果有精度和標度,則會將數據四舍五入後插入,系統不報錯
* DECIMAL如果不設置精度和標度,剛按照默認的(10,0)進行操作,如果數據超過了精度和標度值,則會報錯。
* 賬務、賬務系統必須要用DECIMAL類型確定精確與資金安全。
5. 總結
以需求驅動技術,技術本身沒有優略之分,只有業務之分。
本文出自 “sea” 博客,請務必保留此出處http://lisea.blog.51cto.com/5491873/1943226
MySQL數據類型--------浮點類型實戰