Mysql不同版本cast/truncate函数对浮点型的处理

我们不妨先来看一个现象

select cast(1/5 as decimal(4,2));

我们先盲猜一下这条SQL的运行结果,如果按照我们的一贯经验,那应该是
0.20,毕竟我们as decimal(4,2)是保留两位小数的。但是实际上并不一定是。
在不同的mysql版本下执行了这条sql:

select cast(1/5 as decimal(4,2)) as res,version() as v;

得到的结果如下:

5.6.455.6.365.6.39三个小版本中的表现,不论是cast还是truncate函数,对能整除的操作的保留两位小数
得到的结果都是无法保留末尾是0的小数的,末尾的0会自动被舍弃。

5.7.228.0.15这两个版本表现完全是另一种结果,执行以下SQL:

select cast(1/5 as decimal(4,2)) as castRes,truncate(1/5,2) as truncateRes;

得到的结果都是0.20

某次开发过程中遇到了这个Bug,不得其解,记录一下,以示后来人。不过我们也由此得出一个准则,数据格式的format处理还是
尽可能的交给程序去处理,而不是mysql。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值