为何AWS MySQL Aurora计算同一公式返回不同结果?
AWS Aurora MySQL中等价数学公式计算结果不同的原因
这是浮点数运算精度限制和运算顺序差异导致的结果偏差,核心是中间计算步骤的精度损失累积:
方法1:6000000*(95/365)*(3.00/100)的运算逻辑
- 先执行
95/365:这是一个无限循环的十进制小数,MySQL用DOUBLE类型存储时只能保存近似值(实际存储为0.2602739726027397左右的二进制浮点数) - 用该近似值乘以6000000,得到带有误差的中间结果
1561643.8356164384 - 再乘以
3.00/100的精确值0.03,之前的误差被放大,最终返回结果与真实值出现偏差。
方法2:((6000000*95*3.00)/36500)的运算逻辑
- 先执行乘法链:
6000000*95=570000000,再乘以3.00得到1710000000.0——这一步都是精确计算,没有精度损失 - 最后执行
1710000000.0/36500,仅在最后一步产生一次除法近似误差,因此结果更接近真实值。
计算器通常采用更高精度的运算机制(比如十进制浮点或多位数二进制浮点),能将误差控制到可忽略的程度,所以两种写法得到一致结果;而MySQL的DOUBLE类型运算在分步除法时会累积误差,最终导致结果差异。
解决建议
- 优先采用先乘后除的运算顺序,减少中间步骤的精度损失
- 强制使用DECIMAL高精度类型运算,避免DOUBLE的二进制浮点误差:
SELECT CAST(6000000 AS DECIMAL(20,4)) * (CAST(95 AS DECIMAL(20,4))/365) * (CAST(3.00 AS DECIMAL(20,4))/100);
内容的提问来源于stack exchange,提问作者MadhanKumar BujjingaRao
相关产品推荐
相关产品推荐

