温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Float浮点数精度为何丢失

发布时间:2026-07-15 07:19:53 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

浮点数(Float)精度丢失,本质上是因为计算机用有限的二进制位来表示无限的实数,导致很多十进制小数无法被精确表示。下面从原理到例子一步步说明。


一、根本原因:二进制无法精确表示某些十进制小数

1️⃣ 十进制转二进制并不总是精确

人类常用的是十进制,而计算机内部使用的是二进制

例如:

  • 十进制 0.5 → 二进制 0.1 ✅(可以精确表示)
  • 十进制 0.1 → 二进制是一个无限循环小数
0.1(十进制)
= 0.00011001100110011...(二进制,无限循环)

但 float 的存储空间是有限的,只能截断,于是就产生了误差。


二、浮点数在计算机中的存储方式(IEEE 754)

单精度 float(32 位) 为例:

符号位(1) | 指数(8) | 尾数(23)

它表示的是:

(-1)^符号 × 1.尾数 × 2^指数

关键点

  • 尾数(有效数字)只有 23 位
  • 只能保存有限位数的二进制小数
  • 超出部分必须舍入

✅ 这正是精度丢失的直接原因


三、一个经典例子:0.1 + 0.2 ≠ 0.3

在代码中

console.log(0.1 + 0.2 === 0.3); // false

实际计算结果是

0.1 + 0.2 = 0.30000000000000004

原因:

  • 0.10.2 在二进制中都不精确
  • 相加后误差被放大
  • 最终结果与 0.3 的二进制表示不完全一致

四、为什么整数通常“看起来”不丢精度?

因为:

  • 小整数在二进制中可以精确表示
  • 但在浮点数中,整数范围有限

例如:

9007199254740992 + 1 === 9007199254740992 // true(精度丢失)

五、float vs double 精度对比

类型 位数 有效数字(十进制)
float 32 约 7 位
double 64 约 15–16 位

double 只是“更精确”,仍然不是绝对精确


六、哪些场景容易踩坑?

❌ 用 float 比较相等

if (a == 0.1 + 0.2) // 不推荐

❌ 金融金额计算

price * quantity // 可能出错

✅ 正确做法

  • 整数(分) 表示金额
  • 或用 decimal / BigDecimal
  • 或用误差范围比较
Math.abs(a - b) < 1e-9

七、一句话总结

浮点数精度丢失,是因为计算机用有限位数的二进制去表示无限精度的实数,必然会产生舍入误差。

如果你愿意,我也可以:

  • 图示 解释 float 存储
  • 对比 float / double / decimal
  • 为什么金融系统不用 float
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI