toFixed可能存在四舍五入问题

toFixed可能存在四舍五入问题,与浏览器有关。

1.335.toFixed(2) // 1.33 (chrome)

解决参考http://www.cnblogs.com/snandy/p/4886131.html:

个人未测试。

// toFixed 修复
function toFixed(num, s) {
    var times = Math.pow(10, s)
    var des = num * times + 0.5
    des = parseInt(des, 10) / times
    return des + ''
}

数值比较

我们在判断比较两个浮点数时,可以通过这个常量来进行判断比较,定义一个最小的进度范围,误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。比如,误差范围设为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 // false
withinErrorMargin(0.1 + 0.2, 0.3) // true

1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true

比较数字

需要注意,NaN与任何值都不相等,包括它自己。
js中,所有的是最都是双精度的,因为双精度都是近似值。

比较的是整数,(在Number.MIN_SAFE_INTEGER和Number.MAX_SAFE_INTEGER之间,包括两端的值),可放心比较。

比较的是小数,最好测试它是否足够接近目标值。js存在一个数值常量Number.EPSILON,大约是2.22e-16,它通常代表需要考虑两个数字差别时的差异程度。

比较是否等于0.3: Math.abs(n-0.3) < Number.EPSILON