场景说明
研发同事让把某个double类型字段的值四舍五入保留2位小数,mysql中round(col,2)可以实现四舍五入并且保留2位小数,但是神奇的事情发生了:发现有的四舍五入是正确的,而有的不是我们想要的结果,如下:简单模拟此场景:
yujx>drop table dd;yujx>create table dd (a double);yujx>insert into dd values(956.745),(231.34243252),(321.43534),(5464.446);yujx>select a,round(a,2) from dd;+--------------+------------+
| a| round(a,2) |
+--------------+------------+
|956.745 |956.74|#可以看到并不是我们期望的956.75| 231.34243252 |231.34 |
|321.43534 |321.44 |
|5464.446 |5464.45 |
+--------------+------------+
4 rows in set (0.00 sec)
如上,有的是正确的,有的不是我们期望的值,那么问题来了,为什么呢?
通过询问和网上搜索后,发现可能是因为double的精度问题导致的
查阅MySQL官当关于double、Float、DECIMAL, NUMERIC类型的介绍,如下:
FLOAT, DOUBLE
#为了说明问题,摘了官当的部分内容,关于更详细的介绍请