1. 程式人生 > >MySQL數據類型--------浮點類型實戰

MySQL數據類型--------浮點類型實戰

mysql dba 數據類型

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. 整數類型所需的存儲和值範圍

類型占用空間精度精確性
FLOAT4單精度精確到小數點後7位小數
DOUBLE8雙精度精確到小數點後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數據類型--------浮點類型實戰