JavaScript中为什么 0.1 + 0.2 != 0.3
程序员文章站
2022-03-26 21:47:46
涉及面试题:为什么 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采用....
涉及面试题:为什么
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.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
本文地址:https://blog.csdn.net/LuckXinXin/article/details/109073646
下一篇: Vue双向绑定实现多选和全选
推荐阅读
-
解决JavaScript中0.1+0.2不等于0.3问题
-
解决JavaScript中0.1+0.2不等于0.3问题
-
为什么JavaScript中0.1 + 0.2 != 0.3
-
解决0.1+0.2≠0.3的问题
-
JavaScript中为什么 0.1 + 0.2 != 0.3
-
为什么JS中0.1+0.2 != 0.3
-
如何解决JavaScript中0.1+0.2不等于0.3
-
js png图片(有含有透明)在IE6中为什么不透明了_javascript技巧
-
js png图片(有含有透明)在IE6中为什么不透明了_javascript技巧
-
javascript - php文件中执行print_r($_POST)时,显示Array(),为什么呢?