博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么JavaScript里面0.1+0.2 === 0.3是false
阅读量:4602 次
发布时间:2019-06-09

本文共 1108 字,大约阅读时间需要 3 分钟。

以下这一篇说明的很详细:

0.1+0.2 === 0.3 //返回是false, 这是为什么呢??

我们知道浮点数计算是不精确的,上面的返回式实际上是这样的:

0.1 + 0.2 = 0.30000000000000004

0.1 + 0.2 - 0.3 = 5.551115123125783e-17

5.551115123125783e-17.toFixed(20) = '0.00000000000000005551'

在JavaScript的新规范ES6加入了一个新的东西-->Number.EPSILON

Number.EPSILON是在Number对象上面,新增一个极小的常量。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。

对于 64 位浮点数(double)来说,大于 1 的最小浮点数相当于二进制的 1.00..001 ,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2 的-52 次方。

Number.EPSILON 实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。

好了,我们来解决上面的浮点数计算的问题:

Number.EPSILON 可以用来设置“能够接受的误差范围”。比如,误差范围设为 2 的-50 次方(即 Number.EPSILON * Math.pow(2, 2) ),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。

5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2) // true

因此, Number.EPSILON 的实质是一个可以接受的最小误差范围。

function withinErrorMargin (left, right) {    return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);}

0.1 + 0.2 === 0.3 // false

withinErrorMargin(0.1 + 0.2, 0.3) // true

1.1 + 1.3 === 2.4 // false

withinErrorMargin(1.1 + 1.3, 2.4) // true

上面的代码为浮点数运算,部署了一个误差检查函数。


文章引用自ES6标准。

原文地址:

转载于:https://www.cnblogs.com/lalalagq/p/9903699.html

你可能感兴趣的文章
掉队于云计算市场是甲骨文裁员的最大原因
查看>>
2019春第三周编程
查看>>
datetime处理日期和时间
查看>>
IOS AFNetWorking 设置超时时间
查看>>
iOS 使用markdown 实现编辑和预览文本
查看>>
X86系列CPU 注记(二)
查看>>
一个简单的消息处理框架
查看>>
RTSP会话基本流程
查看>>
C++——OOP面向对象理解
查看>>
[系统]archlinux的glibc又调皮了……
查看>>
使用 Vue.js 和 Chart.js 制作绚丽多彩的图表
查看>>
内置函数
查看>>
mysql 5.6二进制安装
查看>>
c#调用c++ dll(二)
查看>>
XXS level10
查看>>
20175301 实验五《网络编程与安全》实验报告
查看>>
window下的run命令行解释 - 转
查看>>
android 数据存储方式
查看>>
第一次作业
查看>>
SQL中的escape的用法
查看>>