知识卡片
浮点不是实数
内容
浮点数是在有限二进制位里近似表达实数,很多十进制小数无法被精确表示。比较金额、比例或累计误差时,直接等值判断会把表示误差当成业务事实。
参考来源
- 位置:《Go语言底层原理剖析》第2章《浮点数设计原理与使用方法》2.1、2.2节《浮点数陷阱》《定点数与浮点数》
- 结论依据:原文用 0.1+0.2×3 实际输出 0.8999999999999999 的例子说明浮点数会丢失精度,紧接着解释原因——"大多数小数表示成二进制后是近似且无限的",以 0.1 转二进制为无限循环小数为例,说明"有限的空间无法表达无限的结果",因此可以推出"浮点数是有限位近似表达实数"的结论。
- 原始内容:以下面的一段简单程序为例,有人会天真地认为其输出结果是0.9,但实际的输出结果是0.8999999999999999。结果的荒诞性告诉我们,必须深入理解浮点数在计算机中的存储方式及性质……计算机通过二进制的形式存储数据,然而大多数小数表示成二进制后是近似且无限的。以0.1为例,它是一个简单的十进制数,转换为二进制数后却非常复杂——0.0001100110011001100…是一个无限循环的数字。显然不能用数学中的计算方式存储所有的小数,因为有限的空间无法表达无限的结果。