i工惠项目有统计用户信息、商家信息以及系统信息的需求,之前一直用 mysql 的 sum 函数求和,并没有注意到精度的问题。而这个项目里面的工钱精度为 2(也就是保留两位小数),求出来的结果竟然出现 6-7 位的小数,这是不合理的。字段默认为 0,所有不存在 null 值干扰结果的情况。那就只能是 sum 函数求和问题了。

网上搜了一下 sum 结果不准确的解决方案,发现大多都是这样的:

SUM(CAST(`FIELD` AS DECIMAL(18, 2)))

为确保解决方案的准确行,先取出所有记录,然后用 php 遍历累加得到一个结果,再用上面的方法得到的结果,对比结果是准确的。

实验发现 php 遍历累加花费的时间比 mysql 语句求和多得多,也就是说这样的统计,mysql 求和效率更高一些,能更快的出结果。然后考虑性能问题,可以再加一个缓存,设置 5 分钟更新一次结果,这样最完美。