为什么0.1 + 0.2 !== 0.3,如何让其相等?

简介: 为什么0.1+0.2不等于0.3呀?因为计算机是通过二进制的方式存储数据的,所以计算机计算0.1+0.2的时候,实际上是计算的两个数的二进制的和。0.1的二进制是0.0001100110011001100…(1100循环),0.2的二进制是:(1100循环),这两个数的二进制都是无限循环的数。那JavaScript是如何处理无限循环的二进制小数呢?

为什么0.1 + 0.2 !== 0.3?

let a = 0.1,b = 0.2
console.log(0.1 + 0.2); //0.30000000000000004

为什么0.1+0.2不等于0.3呀?


因为计算机是通过二进制的方式存储数据的,所以计算机计算0.1+0.2的时候,实际上是计算的两个数的二进制的和。0.1的二进制是0.0001100110011001100…(1100循环),0.2的二进制是:(1100循环),这两个数的二进制都是无限循环的数。那JavaScript是如何处理无限循环的二进制小数呢?


一般我们认为数字包含整数和小数,但在js中只有一种数字类型:Number,它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。在二进制科学表示法中,双精度浮点数的小数部分最多只能保留52位,再加上前面的1,其实就是保留53位有效数字,剩余的需要舍去,遵从“0舍1入”的原则。


根据这个原则,0.1和0.2的二进制数相加,再转化为十进制数就是:0.30000000000000004


解决办法

可以使用保留两位小数的方法

let a =0.1,b=0.2
console.log((a+b).toFixed(2) == 0.3);
相关文章
|
JavaScript
NATAPP使用教程(内网穿透)
NATAPP使用教程(内网穿透)
973 0
|
开发工具 git
最好的 Git 动画教程,没有之一
介绍 Git 动画教程的学习方法。
最好的 Git 动画教程,没有之一
J3
|
存储 前端开发 JavaScript
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
J3
662 0
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
|
7月前
|
人工智能 前端开发 算法
自由编程学习资源:free-programming-books
`free-programming-books` 是一个GitHub上的开源项目,旨在收集和整理免费的编程学习资源,涵盖了各种编程语言、框架、工具和范畴。这个项目的目标是为广大的学习者提供高质量、免费且易于获取的学习资料,促进技术知识的传播和共享。
347 2
自由编程学习资源:free-programming-books
|
7月前
|
前端开发
vue3父子传值实现弹框功能
vue3父子传值实现弹框功能
|
7月前
|
存储 前端开发 安全
常见的前端加密方式都有哪些?
【4月更文挑战第19天】本文介绍了前端加密的四种常见方法:哈希加密、对称加密、非对称加密和混合加密。哈希加密适用于密码存储,但存在哈希碰撞风险;对称加密速度快,适合安全通信;非对称加密更安全,但速度慢;混合加密结合两者优点,常用于 SSL/TLS。前端加密是数据安全的重要一环,但需与后端安全措施配合以构建全面防护体系。示例代码展示了 JavaScript 中的 SHA-256、AES 和 RSA 加密。
729 6
|
7月前
|
前端开发
【面试题】说说你对 async和await 理解
【面试题】说说你对 async和await 理解
100 0
|
应用服务中间件 测试技术 nginx
Nginx系列教程(03) - 外网映射(NatApp)
Nginx系列教程(03) - 外网映射(NatApp)
206 0
|
Java
|
人工智能
langchain:Prompt在手,天下我有
prompts是大语言模型的输入,他是基于大语言模型应用的利器。没有差的大语言模型,只有差的prompts。 写好prompts才能发挥大语言模型300%的功力。 理论上,要写好prompts其实不是那么容易的,但是langchain把这个理论变成了现实,一起来看看吧。