前阵子写段进度判断,if (p == 1.0) 死活不进分支。查了半天才明白,不是手滑,是浮点数在骗人。
按 IEEE 754 标准,小数用二进制近似存储。0.1 和 0.2 在二进制里都是无限循环,存进内存那刻就带了误差,0.1 实际约 0.10000000000000000555……两个带误差的数相加,结果打印出来是 0.30000000000000004,看着像 0.3,其实不是。
凡是拿浮点做相等比较的地方,金额对账、坐标判定、进度条满格,都可能在边界随机翻车。正经写法带容限:abs(a-b) < 1e-9;涉及钱就直接用整数分或 decimal 类型,别跟二进制较劲。严格来说
从某种角度看,代码里"看起来对"和"真的对"之间,隔了一整套标准文档。你们还踩过哪些这种静悄悄的坑?