原文链接:https://blog.csdn.net/weixin_42047611/article/details/81449663
MySQL 中使用浮点数和定点数来表示小数。
浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE);定点类型只有一种,就是 DECIMAL。
浮点类型和定点类型都可以用(M, D)
来表示,其中M
称为精度,表示总共的位数;D
称为标度,表示小数的位数。
浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能大于 M-2),分别表示显示宽度和小数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所支持的最大精度。DECIMAL 的默认 D 值为 0、M 值为 10。
下表中列出了 MySQL 中的小数类型和存储需求。
类型名称 | 说明 | 存储需求 |
---|---|---|
FLOAT | 单精度浮点数 | 4 个字节 |
DOUBLE | 双精度浮点数 | 8 个字节 |
DECIMAL (M, D),DEC | 压缩的“严格”定点数 | M+2 个字节 |
DECIMAL 类型不同于 FLOAT 和 DOUBLE。DOUBLE 实际上是以字符串的形式存放的,DECIMAL 可能的最大取值范围与 DOUBLE 相同,但是有效的取值范围由 M 和 D 决定。如果改变 M 而固定 D,则取值范围将随 M 的变大而变大。
从上表中可以看到,DECIMAL 的存储空间并不是固定的,而由精度值 M 决定,占用 M+2 个字节。
FLOAT 类型的取值范围如下:
- 有符号的取值范围:-3.402823466E+38~-1.175494351E-38。
- 无符号的取值范围:0 和 -1.175494351E-38~-3.402823466E+38。
DOUBLE 类型的取值范围如下:
- 有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308。
- 无符号的取值范围:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。
提示:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
FLOAT 和 DOUBLE 在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL 如果不指定精度,默认为(10,0)。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题。
最后再强调一下:在 MySQL 中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用 DECIMAL 的类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。
我们在Mysql中存字段的时候,比如,一些与金钱有关的数据。这个时候就会对精确到的要求非常高。那么这个时候,就会发现我们之前所学的八大基本类型不再能够满足需求,无论是整形还是浮点型,有人会说存整形有什么不可,但是你要知道不是每个人的金额都是整数的;这样不行的话,存浮点型的就可以了嘛,对于银行存钱来说,一个小数点的问题都会将一笔钱的金额变得很大或者很小......So,这个时候你可以尝试一下Decimal类型,你会发现能够很好地解决你的问题。
decimal详细介绍:
decimal(a,b)
参数说明:
a:指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度为38.
b:指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从0~a之间的值,默认小数位数是0.
举例说明,11615.23653234568这个数存你说的三个格式
decimal:11615
decimal(3):999
decdimal(3,2):9.99
decimal(10,5)11615.23653
超出精度范围的数会被强制进位并只显示数据类型定义的格式
备注:
decimal数据类型用于要求非常高的精确计算中,这些类型允许指定数值的精确度和计算方法作为选择参数。精确度在这里指为这个值保存的有效数字的总个数。而计数方法指的是小数点后数字的个数。例如:decimal(5,2)规定了存储的值将不会超过五位数字 ,而且小数点后面有两位数字。
实例1:
mysql> create table t1(c1 float(10,2), c3decimal(10,2)); Query OK, 0 rows affected (0.02 sec) mysql> insert into t1 values(9876543.21, 9876543.12); Query OK, 1 row affected (0.00 sec) mysql> select * from t1; +----------------+----------------+ | c1 | c3 | +----------------+----------------+ | 9876543.00 | 9876543.12 | +----------------+-----------------+ 2 rows in set (0.00 sec)
会发现,flocat类型的字段会自动将值四舍五入,而decimal类型的不会,如果用flocat类型的去存与金额有关的数据的时候就会出现问题,而decimal类型的就不会。
实例2:decimal(5,2)
mysql> create table t1(id1 float(5,2) default null,id2 double(5,2) default null, id3 decimal(5,2) default null ); mysql> insert into t1 values(1.2345,1.2345,1.2345); Query OK, 1 row affected, 1 warning (0.04 sec) mysql> show warnings; +-------+------+------------------------------------------+ | Level | Code | Message | +-------+------+------------------------------------------+ | Note | 1265 | Data truncated for column 'id3' at row 1 | +-------+------+------------------------------------------+ 1 row in set (0.00 sec)
1.2345 --- 小数点后最多2位,所以保存可以,自动四舍五入数据截断,但会报waning
12.34 --- OK
1234.5 --- 因为小数部分未满2位,要补0.所以保存应该1234.50。所以整个位数超出了5,保存报错。
1.2 --- 小数未满部分补0。按照1.20保存。
默认状态比较:
浮点数如果不写精度和标度,会按照实际精度值保存,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值decimal(10,0)来操作,如果数据超过了精度和标度值,系统会报错。
来源:https://www.cnblogs.com/lvchengda/p/12517509.html