码农小屋 码农小屋
  • 首页
  • 文章
    • Python
    • 计算机基础
    • C语言
    • Java
    • 数据库
    • Linux
  • 资源
  • 随笔
  • 优秀软件
  • 24h新鲜事
  • 专题
  • 留言板
  • 注册
    登录
立即登录
  • 首页
  • 博客中心
    • 文章
    • 资源
  • 随笔
  • 优秀软件
  • 24h新鲜事
  • 专题
  • 留言板

JavaScript中为什么 0.1 + 0.2 != 0.3

独家记忆5月前

涉及面试题:为什么0.1 + 0.2 != 0.3?如何解决这个问题?

原因,因为 JS 采用 IEEE 754 双精度版本(64位),并且只要采用 IEEE 754 的语言都有该问题。

我们都知道计算机是通过二进制来存储东西的,那么 0.1 在二进制中会表示为

// (0011) 表示循环
0.1 = 2^-4 * 1.10011(0011)

我们可以发现,0.1 在二进制中是无限循环的一些数字,其实不只是 0.1 ,其实很多十进制小数用二进制表示都是无限循环的。这样其实没什么问题,但是 JS采用的浮点数标准却会裁剪掉我们的数字。

IEEE 754 双精度版本(64位)将 64 位分为了三段

  • 第一位用来表示符号
  • 接下去的 11 位用来表示指数
  • 其他的位数用来表示有效位,也就是用二进制表示 0.1 中的 10011(0011)

那么这些循环的数字被裁剪了,就会出现精度丢失的问题,也就造成了 0.1 不再是 0.1 了,而是变成了 0.100000000000000002

0.100000000000000002 === 0.1 // true

那么同样的,0.2 在二进制也是无限循环的,被裁剪后也失去了精度变成了 0.200000000000000002

0.200000000000000002 === 0.2 // true

所以这两者相加不等于 0.3 而是

0.1 + 0.2 === 0.30000000000000004 // true

那么可能你又会有一个疑问,既然 0.1 不是 0.1,那为什么 console.log(0.1) 却是正确的呢?

因为在输入内容的时候,二进制被转换为了十进制,十进制又被转换为了字符串,在这个转换的过程中发生了取近似值的过程,所以打印出来的其实是一个近似值,你也可以通过以下代码来验证

console.log(0.100000000000000002) // 0.1

解决

parseFloat((0.1 + 0.2).toFixed(10)) === 0.3 // true
2
分享
独家记忆 作者
文章 27评论 2
赞赏
独家记忆
相关文章
  • JSP入门,制作两个简单的JSP页面
  • 初识JavaScript
评论 (0)
再想想
    沙发抢一发
独家记忆
作者
一个爱学习的程序猿
27文章
2评论
30获赞
文章推荐
ZIP Pro 3 – 文件压缩分享加密管理套件
5月前
Uninstall Tool-专业的软件卸载工具
6月前
Speccy:优秀的硬件检测工具
6月前
CleanMyPC-专为 Windows打造的清理工具
6月前
Internet Downloader Manager-一款专业的Win下载工具
7月前
Wise Care 365-Windows 系统清理和加速工具
7月前
新鲜事
新Mac太牛:在电脑上运行iPhone、iPad的软件、游戏
5月前
苹果发布会总结:一个芯片,三款产品!苹果这把棋下得可真深
5月前
荣耀命运落定:救了自己,也救华为
5月前
发布会停不下来,苹果下月发布新Mac
6月前
iPhone 12 开启 5G 续航锐减,苹果回应
6月前
华为Mate40正式发布
6月前
更多
  • 专题
  • 文章
  • 友情链接
  • 留言板
Copyright © 2020-2021 码农小屋. 苏ICP备20033168号