浮点数(Float)精度丢失,本质上是因为计算机用有限的二进制位来表示无限的实数,导致很多十进制小数无法被精确表示。下面从原理到例子一步步说明。
人类常用的是十进制,而计算机内部使用的是二进制。
例如:
0.5 → 二进制 0.1 ✅(可以精确表示)0.1 → 二进制是一个无限循环小数0.1(十进制)
= 0.00011001100110011...(二进制,无限循环)
但 float 的存储空间是有限的,只能截断,于是就产生了误差。
以 单精度 float(32 位) 为例:
符号位(1) | 指数(8) | 尾数(23)
它表示的是:
(-1)^符号 × 1.尾数 × 2^指数
✅ 这正是精度丢失的直接原因
console.log(0.1 + 0.2 === 0.3); // false
0.1 + 0.2 = 0.30000000000000004
原因:
0.1 和 0.2 在二进制中都不精确0.3 的二进制表示不完全一致因为:
例如:
9007199254740992 + 1 === 9007199254740992 // true(精度丢失)
| 类型 | 位数 | 有效数字(十进制) |
|---|---|---|
| float | 32 | 约 7 位 |
| double | 64 | 约 15–16 位 |
double 只是“更精确”,仍然不是绝对精确。
❌ 用 float 比较相等
if (a == 0.1 + 0.2) // 不推荐
❌ 金融金额计算
price * quantity // 可能出错
✅ 正确做法
Math.abs(a - b) < 1e-9
浮点数精度丢失,是因为计算机用有限位数的二进制去表示无限精度的实数,必然会产生舍入误差。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。