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

Swift中Double类型计算异常:0.1+0.2为何不等于0.3?

为什么Swift里0.1 + 0.2不等于0.3?

嘿,这个问题可是浮点数计算里的经典“陷阱”,不光Swift,几乎所有遵循IEEE 754标准的编程语言都会遇到哦!

核心原因:浮点数的二进制存储限制

咱们平时用的十进制数,有些转换成二进制后是无限循环的小数——就像十进制里的1/3是0.333...永远写不完一样,0.1和0.2在二进制里就是无限循环的。

而Swift里的Double类型遵循IEEE 754双精度标准,它只能用64位二进制来存储数值,所以只能对这些无限循环的小数做近似存储。当你把这两个近似值相加时,误差会累积,最终得到的结果其实是一个非常接近0.3但严格不等于0.3的数。比如你可以打印一下testSum:

let testSum = 0.1 + 0.2
print(testSum) // 实际输出:0.30000000000000004

这样一来,testSum == 0.3返回false就完全合理啦。

怎么解决这个问题?

根据你的使用场景,有两种常用的解决方案:

1. 用Decimal类型做精确运算

如果是对精度要求极高的场景(比如金融、货币计算),推荐使用Decimal类型,它专门用来处理十进制数的精确运算:

let num1 = Decimal(string: "0.1")!
let num2 = Decimal(string: "0.2")!
let testSum = num1 + num2
let testBool = testSum == Decimal(string: "0.3")!
print(testBool) // 输出:true

2. 比较差值是否在可接受的精度范围内

如果还是想用Double,可以定义一个极小的精度阈值(比如1e-9,也就是十亿分之一),判断两个浮点数的绝对差值是否小于这个阈值:

let testSum = 0.1 + 0.2
let testBool = abs(testSum - 0.3) < 1e-9
print(testBool) // 输出:true

内容的提问来源于stack exchange,提问作者Evgeniy Kleban

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:54:30