原先项目有关金额的部分数据都会定义成 float 或 double 类型,可以肯定的是 32 位存储空间 float 和 64 位存储空间的 double 具有更高的精度。但在实际对数据进行加工,比如 sum 求和等得到的数据会出现更多位的小数。比如手动计算结果 7.75 使用了 sum 函数得到 7.750000059604645

从数字层面上可以很清晰的觉察到数据的精度发生了变化,但这却并不怪函数本省,因为 float 或 double 这种表示浮点数类型的值本省就是高精度存储,只不过在正常记录插入的时候,显示上没有感知到。而在计算的时候,高精度之间的误差就显示出来了。

之前不了解,会以为是 php 语言造成的。后面查看相关文档发现 decimal 类型的数据就可以正常的计算,不会出现精度失常的情况。根据现有保存的数据精度,可以设置 decimal 的精度(小数点后几位),然后保存就可以。当然为了数据安全,最好在修改之前做一下数据备份。修改之后就不需要再通过 php 对数据精度进行控制了。