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
相关产品推荐
相关产品推荐

