Python 3.7.3环境下5.6-2.2运算结果精度异常的原因是什么?
Python 3 下浮点运算出现精度偏差的核心原因
- 该现象并非Python专属的实现bug,是所有遵循IEEE 754双精度浮点数存储规范的编程语言(C、Java、JavaScript等)都会出现的通用固有特征,和Python版本没有直接关联。
- 计算机的二进制存储体系,无法对所有日常使用的十进制小数做精确表示。类似
5.6、2.2这类十进制数,转换为二进制表示时是无限循环的小数序列,受64位双精度浮点数的固定存储长度限制,系统只能存储和输入字面量最接近的二进制近似值,这个近似值本身就和我们认知里的十进制数值存在极其微小的存储误差。 - 两个带存储近似误差的浮点数完成减法运算后,最终得到的二进制结果换算回十进制展示,就会呈现为你看到的
3.3999999999999995这类偏离预期的数值。
你可以直接通过内置函数查看浮点数的真实存储精度,验证上述逻辑:
# 查看两个参与运算的字面量的实际存储精度 format(5.6, ".20f") # 输出结果: '5.59999999999999964473' format(2.2, ".20f") # 输出结果: '2.20000000000000017764'
常见的精度处理方案
- 仅需对计算结果做展示输出时,使用你已知的
round()函数,或是通过字符串格式化限定小数位数,就可以得到符合日常使用预期的展示效果。 - 涉及金额结算、精密科学计算等需要绝对精度的场景,不要使用原生
float类型,改用Python标准库提供的decimal模块实现十进制定点数运算,完全匹配日常十进制计算的精度预期。
内容的提问来源于stack exchange,提问作者veziop
相关产品推荐
相关产品推荐

