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

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

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

我们不妨先来看一个现象

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

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

1
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:

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

得到的结果都是0.20

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

# mysql

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×