关于JavaScript中浮点数比较的问题

来源:互联网 发布:淘宝网电动车配件 编辑:程序博客网 时间:2024/05/23 12:54

我们在javascript中操作浮点数加减运算判断时经常会遇到这样的问题,比如

0.1+0.2 == 0.3
false

按照我们正常的思维 应该是相等啊,怎么返回的是 false 呢?
这个是因为javascript的进度问题,我们看一下

0.1+0.2
0.30000000000000004
0.1 + 0.2 - 0.3
5.551115123125783e-17

如何解决此问题,在新的ES6中引入了一个 极小的常量 Number.EPSILON,它表示1与大于1的最小浮点数之间的差.
对于64位浮点数来说,大于1的最小浮点数相当于二进制的1.00..001,小数点后面有连续51个零。这个值减去1之后,就等于2的-52次方.

Number.EPSILON === Math.pow(2, -52)
// true
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// “0.00000000000000022204”

所以我们在判断比较两个浮点数时,可以通过这个常量来进行判断比较,定义一个最小的进度范围,误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。比如,误差范围设为2的-50次方(即Number.EPSILON * Math.pow(2, 2)),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。

function withinErrorMargin (left, right) {  return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);}0.1 + 0.2 === 0.3 // falsewithinErrorMargin(0.1 + 0.2, 0.3) // true1.1 + 1.3 === 2.4 // falsewithinErrorMargin(1.1 + 1.3, 2.4) // true

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

原创粉丝点击