MySQL小数四舍五入异常:不同行计算结果不一致问题咨询
MySQL小数四舍五入结果不一致的原因
这种差异本质是二进制浮点数的精度限制和MySQL数据类型、计算逻辑共同导致的,具体原因如下:
精确值与浮点近似值的偏差
先看精确计算:183.25 * 9.7的精确结果是1777.525,理论上四舍五入到两位小数应为1777.53;186.55 * 9.7的精确结果是1809.535,四舍五入到两位小数是1809.54。
但如果用FLOAT或DOUBLE这类二进制浮点类型存储/计算,部分十进制小数无法被二进制精确表示,会以近似值存储。比如1777.525的二进制近似值可能是1777.5249999999998,此时MySQL的ROUND()函数会基于这个近似值计算,得到1777.52;而1809.535的二进制近似值可能更接近1809.5350000000002,ROUND后就得到预期的1809.54。
数据类型的差异
如果两行数据的字段类型不同——比如第一行用FLOAT/DOUBLE,第二行用DECIMAL——也会导致结果差异。DECIMAL是十进制存储,能精确表示指定精度内的小数,计算时不会出现二进制浮点的精度丢失;而FLOAT/DOUBLE的二进制存储特性决定了必然存在精度误差。ROUND函数的计算逻辑
MySQL的ROUND()函数对浮点类型和DECIMAL类型的处理逻辑不同:对DECIMAL会基于十进制精确值计算,对浮点类型则基于二进制近似值计算。如果你的计算中混用了不同数据类型,就可能出现同一逻辑下结果不一致的情况。
验证方法:可以执行SELECT ROUND(183.25 * 9.7, 2), ROUND(CAST(183.25 AS DECIMAL(10,2)) * CAST(9.7 AS DECIMAL(10,2)), 2);对比结果,后者用DECIMAL计算会得到正确的1777.53。
内容的提问来源于stack exchange,提问作者Iain H.
相关产品推荐
相关产品推荐

