讲给小学生听----《浮点数为什么不精确》
第一章数字王国的“完美世界”在我们平时的世界十进制0.5 1/2 ✅ 0.25 1/4 ✅ 0.1 1/10 ✅看起来都很正常对吧♂️ 第二章进入计算机世界计算机里其实是只认识二进制0 和 1所以 所有小数都要变成二进制小数⚡ 第三章问题出现了 主角登场0.1我们来把它变成二进制0.1 × 2 0.2 → 0 0.2 × 2 0.4 → 0 0.4 × 2 0.8 → 0 0.8 × 2 1.6 → 1 0.6 × 2 1.2 → 1 ... 你会发现0.1 1/10 10 2*5 不是2的幂次方0.1(10) 0.00011001100110011...(2) 是无限循环 第四章灾难来了计算机说“我内存有限不能存无限位啊”于是它决定截断只存一部分比如0.00011001100110011只存前几位 关键结论计算机存的不是 0.1 的真实值而是一个“非常接近 0.1 的数” 第五章经典Bug出现 问题cout (0.1 0.2);你以为是0.3 ❌实际可能是0.30000000000000004 为什么因为0.1 ≠ 精确值 0.2 ≠ 精确值 两个“不精确”的数相加 结果当然也“不精确” 第六章哪些数是安全的✅ 可以精确表示的重点 分母是 2 的幂次方1/2 0.5 ✅ 1/4 0.25 ✅ 1/8 0.125 ✅ 因为它们可以变成有限二进制❌ 不精确的1/10 0.1 ❌ 1/3 0.333... ❌ 会变成无限二进制 第七章计算机的存储方式计算机用一种叫浮点数float / double它像这样存科学计数法二进制版 符号 指数 尾数类似1.23 × 10^5十进制 1.01 × 2^3二进制⚠️ 第八章实际编程怎么处理 方法1比较时用误差if(abs(a - b) 1e-6) 不直接用 方法2用整数比如钱用“分”代替“元”int money 123; // 表示1.23元 方法3竞赛技巧 控制精度#include iomanip cout fixed setprecision(6) x; 第九章小游戏理解 想象你有一个无限长小数0.3333333333333...但纸只能写0.3333 这就是计算机在做的事 最终总结不是计算机算错了 ❌ 是它“存不下” ✔️ 给小学生的口诀二进制世界很严格 无限小数存不全 截断之后有误差 比较千万别用等号