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

insert into t1 values(1.23,1.23,1.23)

可以看到数据都正确的插入了
在这里插入图片描述
(3)再向id1,id2插入数据1.234,而id3依然插入1.23

insert into t1 values(1.234,1.234,1.23);

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

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

insert into t1 values(1.234,1.234,1.234)

结果依然是
在这里插入图片描述
此时虽然数据都插入进去,但是如果命令行形式的话会抛出一个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);

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

上面这个例子验证了上面提到的浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动四舍五入插入,系统不会报错,;
而decimal(定位数)如果不写精度,则默认按照decimal(10,0)来进行操作,并且如果超出了精度和标度值,系统会报错。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值