数据类型-小数
浮点型:
又称为精度类型,是一种可能丢失精度的数据类型,数据可能不那么准确
简单的举例
所有位都为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位
示例
sql
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
sql
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