[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f52VfYVQByYrIVs5frrveixBwVGVIBK9RTE_vqZYB_gQ":3},{"item":4,"related":46},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":35,"sourceName":36,"sourceUrl":37,"status":38,"seoTitle":39,"seoDescription":39,"canonicalUrl":39,"isFeatured":40,"sno":41,"sortOrder":42,"publishedAt":43,"updatedAt":44,"createdAt":45},"55f42805-a25a-4ce3-89d9-121b9a268a8f","article","0.1＋0.2 为什么不等于 0.3？计算机真的算错了吗？","why-point-one-plus-point-two-not-point-three","许多十进制小数无法用有限位二进制精确表示，计算机只能保存最接近的值。微小误差在显示时常被隐藏，却会在比较、累计和金额计算中冒出来。本文用三分之一的类比讲清浮点数，并给出可靠的处理原则。","在许多编程语言里输入 `0.1 + 0.2 == 0.3`，结果可能是 `false`。把和打印得更精细，还会看到类似 `0.30000000000000004` 的数字。计算机连小学加法都算错了吗？\n\n它没有算错，而是在忠实计算自己实际保存的两个近似值。问题从输入小数的那一刻就开始了。\n\n![IEEE 754 单精度浮点数的符号位、指数位和尾数位结构](https:\u002F\u002Fupload.wikimedia.org\u002Fwikipedia\u002Fcommons\u002F0\u002F01\u002FBinary32_format_for_single-precision_floating_point_number.png)\n\n## 十进制有限，二进制未必有限\n\n在十进制中，三分之一写成 `0.3333…`，无论给多少位都无法精确结束。我们只能保留若干位，得到近似值。二进制也有自己的循环小数：十进制的 0.1 转成二进制后是无限重复的 `0.000110011…`。\n\n计算机存储位数有限，只能截取最接近的可表示数。Python 官方的[浮点数说明](https:\u002F\u002Fdocs.python.org\u002F3\u002Ftutorial\u002Ffloatingpoint.html)指出，常见 IEEE 754 双精度浮点数用有限精度保存近似分数；0.1 实际对应一个非常接近、却不完全等于十分之一的二进制分数。\n\n```mermaid\nflowchart LR\n    A[十进制小数 0.1] --> B[转换为无限二进制小数]\n    B --> C[保留有限有效位]\n    C --> D[存下最接近的浮点数]\n    D --> E[多个近似值参与运算]\n    E --> F[误差在比较时显现]\n```\n\n0.2 和 0.3 也分别被近似。两个近似数相加后，与“最接近 0.3 的那个近似数”可能落在不同位置，于是直接比较得到不相等。\n\n## 为什么平时打印仍显示 0.1\n\n如果每次都显示完整近似值，屏幕会充满无用长尾。编程语言通常选择能够往返还原同一浮点数的简短十进制表示，所以显示 `0.1`。这是一种友好的舍入，不表示内存里真的保存了精确十分之一。\n\n误差通常极小，科学计算、图形渲染和机器学习因此可以高效工作。浮点数的价值正是用固定空间覆盖极宽的数值范围，而不是保证所有十进制小数都精确。\n\n## 真正危险的是把近似数当身份编号\n\n如果程序用 `结果 == 目标值` 判断循环是否结束，细小误差可能让条件永远不成立。更稳妥的方法是比较差值是否小于可接受容差，例如判断两个数是否“足够接近”。Python 提供 `math.isclose`，其他语言也有相似做法。\n\n金额计算则通常需要十进制精度。一个办法是使用整数最小单位，例如把 19.99 元保存为 1999 分；另一个办法是使用十进制定点或高精度 Decimal 类型，并明确舍入规则。不能只在界面上保留两位小数，因为显示舍入没有改变底层累计误差。\n\n地理坐标、传感器数据和物理模拟还要根据量级选择容差。一个固定的 `0.000001` 对毫米测量可能太大，对天文距离又可能毫无意义。可靠比较应考虑绝对误差与相对误差。\n\n## 并非所有小数都会出问题\n\n能写成分母为二的幂的分数，可以被有限二进制精确表示。例如 0.5 是二分之一，0.25 是四分之一，0.125 是八分之一。它们就像十进制能精确表示二分之一和五分之一，却不能有限表示三分之一。\n\n整数在自身可表示范围内通常也能精确保存，但范围不是无限的。数值极大后，相邻可表示浮点数的间隔会变宽，甚至出现给大数加一却没有变化的情况。\n\n`0.1＋0.2` 的谜题真正提醒我们的，不是怀疑每一次计算，而是区分“数学实数”和“机器表示”。计算机只能用有限比特描绘无限多数字；理解它怎样近似，才能在需要精确的地方选对工具，在允许误差的地方设对边界。","\u002Fuploads\u002F2026-09-08\u002Ffd3a7daf-2a2c-4ef0-8f57-38f1d9de962c.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","f39339b1-aaa6-4e86-b0c2-a6e6a21113b5",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31],{"id":24,"name":25,"slug":26},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse",{"id":28,"name":29,"slug":30},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":32,"name":33,"slug":34},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding","资料来源","Python 官方文档：Floating-Point Arithmetic","https:\u002F\u002Fdocs.python.org\u002F3\u002Ftutorial\u002Ffloatingpoint.html","published",null,false,54,0,"2026-09-06T00:00:00.000Z","2026-09-08T02:09:13.073Z","2026-08-14T03:06:15.129Z",[47,56,65],{"id":48,"type":6,"title":49,"slug":50,"summary":51,"coverUrl":52,"authorName":14,"sno":53,"publishedAt":54,"createdAt":55},"62724dbd-ce49-4be9-afa9-4ba127513a62","语音搜索一定先变成文字吗？AI 开始绕过转写这一步","speech-to-retrieval-without-transcription","传统语音搜索先把声音转成文字，再拿文字查资料，一次听错就可能让搜索方向完全跑偏。Speech-to-Retrieval 尝试直接把语音与相关文档映射到同一个语义空间。本文用蒙克名画的例子讲清新旧架构及其边界。","\u002Fuploads\u002F2026-09-08\u002Fe1173842-1ec4-48f3-8349-240fc2d78197.jpg",50,"2026-08-30T00:00:00.000Z","2026-08-14T03:06:11.525Z",{"id":57,"type":6,"title":58,"slug":59,"summary":60,"coverUrl":61,"authorName":14,"sno":62,"publishedAt":63,"createdAt":64},"0999bb14-a97c-4003-84e7-61ad2da998e0","文件删除以后去了哪里？为什么有时还能恢复？","where-deleted-files-go-data-recovery","普通删除往往只是移除文件系统里的索引并把空间标记为可重用，数据本身未必立即消失；SSD 的 TRIM、磨损均衡与加密又让情况更加复杂。本文区分回收站、删除、覆盖和安全清除，说明何时应停止写入设备。","\u002Fuploads\u002F2026-09-08\u002Fb7222764-de75-4863-8679-0a94a8965af3.jpg",51,"2026-08-20T00:00:00.000Z","2026-08-14T03:06:15.710Z",{"id":66,"type":6,"title":67,"slug":68,"summary":69,"coverUrl":70,"authorName":14,"sno":71,"publishedAt":72,"createdAt":73},"858bf91b-e11c-4ead-96e1-4fc3eb99ab5d","HTTPS 握手：浏览器和服务器刚连上时到底在聊什么","tls-13-handshake-explained","TLS 1.3 握手用证书确认身份，用密钥协商建立共享秘密，再用 Finished 消息确认双方看到的是同一条会话。本文按消息顺序拆解 1-RTT 握手、前向保密、0-RTT 重放风险，以及 HTTPS 的保护边界。","\u002Fuploads\u002F2026-08-09\u002F16956b29-034c-4cbc-a6ca-80d04f65774d.jpg",65,"2026-08-09T00:00:00.000Z","2026-08-09T12:13:31.177Z"]