天天看点

Mysql数值类型之float,double,decimal

对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度),double(双精度),而定点数只有decimal一种表示。定点数在MySQL内部以字符串的形式存放,比浮点数更精确,所以适合用来表示货币等精度高的数据。

概念:

浮点数和定点数都可以用类型名称后加“(M,D)”的方式来表示,“(M,D)”表示该值一共显示M为数字(整数+小数位),其中D位位于小数点后面,M和D又称为精度和标度,例如,定义为float(7,4)的一个列可以显示为-999.9999。

MySQL保存值得时候进行四舍五入,如果在float(7,4)列内插入999.00009,近似结果是999.0001。值得注意的是,浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用。float个double在不指定精度时,默认会按照实际精度(由实际的硬件和操作系统决定)来显示,而decimal在不指定精度的时候,磨人的整数位是10,小数位是0。

实际操作看一下吧:

(1)创建测试表,分别将id1,id2,id3字段设置为float(5.2),double(5,2),decimal(5,2);

CREATE TABLE `t1` (
  `id1` float(5,2) NOT NULL,
  `id2` double(5,2) NOT NULL,
  `id3` decimal(5,2) NOT NULL
)
           

(2)都插入数据1.23

可以看到数据都正确的插入了

Mysql数值类型之float,double,decimal

(3)再向id1,id2插入数据1.234,而id3依然插入1.23

Mysql数值类型之float,double,decimal

可以看到,数据都正常插入,但是因为float和double的标度限制,舍去了最后一位,而变成了1.23

(4)同是向三个字段都插入1.234试试呢

结果依然是

Mysql数值类型之float,double,decimal

此时虽然数据都插入进去,但是如果命令行形式的话会抛出一个Warning,报告id3被截断,如果是在传统的SQLMode,这条记录是无法插入的。

(5)接下来试试吧所有的精度和标度全部取消,再次插入1.23

alter table t1 modify id1 float;
alter table t1 modify id1 double;
alter table t1 modify id1 decimal;

insert into t1 values(1.23,1.23,1.23);
           
Mysql数值类型之float,double,decimal

这时候发现id1,id2都正常插入数据,而id3的小数点位被截断。

上面这个例子验证了上面提到的浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动四舍五入插入,系统不会报错,;

而decimal(定位数)如果不写精度,则默认按照decimal(10,0)来进行操作,并且如果超出了精度和标度值,系统会报错。