You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何浮点数直接赋值无精度损失?0.1正常0.3-0.2却不准确?

浮点数显示差异的本质:存储近似值与显示舍入规则

我们已经知道浮点数存在精度损失的核心原因:

  • 数学层面:二进制无法100%精确映射所有十进制小数,大部分十进制小数只能用无限循环的二进制小数近似表示,存储时会截断保留有限位
  • 存储层面:浮点数采用科学计数法格式存储,会舍去极小的尾数位,进一步放大近似误差

为什么直接打印0.1显示正常?

所有编程语言在打印浮点数时,都会默认应用舍入显示规则:当浮点数的实际存储值与某个十进制小数的误差小于预设阈值(通常是1e-15级别)时,会直接显示这个十进制小数,而非存储的原始近似值。

0.1的实际存储值是一个非常接近0.1的二进制近似值(比如在Python中用format(0.1, '.20f')可以看到是0.10000000000000000555),它和真实0.1的误差极小,刚好落在显示舍入的阈值内,所以打印时会被自动修正显示为0.1。

为什么0.3 - 0.2的结果打印不准确?

0.3和0.2各自的存储值都是近似值:

  • 0.3的实际存储值约为0.29999999999999998890
  • 0.2的实际存储值约为0.20000000000000001110

两者相减后得到的结果是0.10000000000000008882,这个值和真实0.1的误差超过了显示舍入的阈值,所以打印时会暴露其真实的近似值,而非自动修正为0.1。

验证方式

可以通过强制打印浮点数的高精度格式来观察真实存储值:

# 查看0.1的真实存储值
print(format(0.1, '.20f'))
# 输出:0.10000000000000000555

# 查看0.3-0.2的真实结果
print(format(0.3 - 0.2, '.20f'))
# 输出:0.10000000000000008882

内容的提问来源于stack exchange,提问作者feilong gao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:22:54