涉及面试题:为什么 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 位分为了三段
那么这些循环的数字被裁剪了,就会出现精度丢失的问题,也就造成了 0.1 不再是 0.1 了,而是变成了 0.100000000000000002
0.100000000000000002 === 0.1 // true
那么同样的,0.2 在二进制也是无限循环的,被裁剪后也失去了精度变成了 0.200000000000000002
0.200000000000000002 === 0.2 // true
所以这两者相加不等于 0.3 而是 0.300000000000000004
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
到此这篇关于为什么JavaScript中0.1 + 0.2 != 0.3的文章就介绍到这了,更多相关JS中0.1 + 0.2 != 0.3内容请搜索站长技术以前的文章或继续浏览下面的相关文章希望大家以后多多支持站长技术!
本文实例讲述了YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用...
作者 | 苏宓 出品 | CSDNIDCSDNnews 一月一更的 TIOBE 榜单新鲜出炉快来看看开发...
以下是关于小编给大家日常收集整理php正则表达式,具体内容请看下文详解吧 $str ...
XML的嵌套处理 一般情况下,我们从数据库中查询得到的结果集可能很大,所以从服...
思路一 由该题的解题示例可以想到的最简单的一种思路 将数组最后一个元素取出把...
从PHP7版本开始很多依赖mcrypt扩展的方法都不支持了,PHP7.2.0及以上版本已经完...
好多网友问起来,·深度学习网址导航·深度学习整站系统 的后台管理能否增加批量...
NSA SA概念 2017年12月份的时候,3GPP发布的是 “非独立组网(NSA)” 的5G标准。...
前言 本篇主要记录微信支付中公众号及H5支付全过程。 准备篇 公众号或者服务号(...
浏览器缓存,也就是客户端缓存,既是网页性能优化里面静态资源相关优化的一大利...