當前位置:網站首頁>MySQL數據庫(8):數據類型-小數

MySQL數據庫(8):數據類型-小數

2022-05-15 00:09:09彭世瑜

數據類型-小數

浮點型:

又稱為精度類型,是一種可能丟失精度的數據類型,數據可能不那麼准確

簡單的舉例

所有比特都為1

整數    1 1 1 1 1 1 1 1   都存整數錶示具體數據值
浮點數  1 1 1 | 1 1 1 1 1  10^7 * 數據值,其中3比特用來存指數

float 單精度類型

4字節存儲,7比特精度,錶示數據範圍比整數大得多

基本語法

float 錶示不指定小數比特的浮點數
float(M, D)錶示一共存儲M個有效數字,其中小數部分占D比特

例如:

float(10, 2) 整數部分為8比特,小數部分為2比特

示例

create table my_float(
    f1 float,
    f2 float(10, 2)
);

desc my_float;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| f1    | float       | YES  |     | NULL    |       |
| f2    | float(10,2) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

insert into 
my_float (f1, f2)
values(123.123, 12345678.90);

-- 如果精度丟失,按照四舍五入方式計算
select * from my_float;
+---------+-------------+
| f1      | f2          |
+---------+-------------+
| 123.123 | 12345679.00 |
+---------+-------------+

-- 超出指定比特數
insert into 
my_float (f1, f2)
values(123.123456789, 123456789.90);
ERROR 1264 (22003): Out of range value for column 'f2' at row 1

-- 用戶不能直接插入超過指定整數部分的長度,但是如果是系統自動進比特導致,可以允許
insert into 
my_float (f1, f2)
values(123.123456789, 99999999.99);

select * from my_float;
+---------+--------------+
| f1      | f2           |
+---------+--------------+
| 123.123 |  12345679.00 |
| 123.123 | 100000000.00 |
+---------+--------------+

-- 浮點數可以采用科學計數法來存儲數據
insert into 
my_float (f1, f2)
values(123.123, 10e5);

select * from my_float;
+---------+--------------+
| f1      | f2           |
+---------+--------------+
| 123.123 |  12345679.00 |
| 123.123 | 100000000.00 |
| 123.123 |   1000000.00 |
+---------+--------------+

double 雙精度

8個字節存儲,錶示範圍更大,精度有15比特左右

定點數decimal

能够保證數據精確的小數(小數部分可能不精確,超出長度會四舍五入),整數部分一定精確

decimal(M, D), M錶示總長度,最大值不能超過65,D代錶小數部分長度,最長不能超過30

create table my_decimal(
    float_data float(10, 2),
    decimal_data decimal(10, 2)
);

mysql> desc my_decimal;
+--------------+---------------+------+-----+---------+-------+
| Field        | Type          | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+-------+
| float_data   | float(10,2)   | YES  |     | NULL    |       |
| decimal_data | decimal(10,2) | YES  |     | NULL    |       |
+--------------+---------------+------+-----+---------+-------+

insert into 
my_decimal(float_data, decimal_data)
values(12345678.90, 12345678.90);

mysql> select * from my_decimal;
+-------------+--------------+
| float_data  | decimal_data |
+-------------+--------------+
| 12345679.00 |  12345678.90 |
+-------------+--------------+

insert into 
my_decimal(float_data, decimal_data)
values(99999999.99, 99999999.99);


mysql> select * from my_decimal;
+--------------+--------------+
| float_data   | decimal_data |
+--------------+--------------+
|  12345679.00 |  12345678.90 |
| 100000000.00 |  99999999.99 |
+--------------+--------------+

-- 定點數,整數部分被進比特,會拋出异常
insert into 
my_decimal(float_data, decimal_data)
values(99999999.99, 99999999.999);
ERROR 1264 (22003): Out of range value for column 'decimal_data' at row 1

版權聲明
本文為[彭世瑜]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/135/202205141944090238.html

隨機推薦