0
点赞
收藏
分享

微信扫一扫

MySQL数据库(8):数据类型-小数


数据类型-小数

浮点型:

又称为精度类型,是一种可能丢失精度的数据类型,数据可能不那么准确

简单的举例

所有位都为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



举报

相关推荐

0 条评论