javascript 浮点数比较

1年前 (2023-09-06)阅读89回复0
佳欣
佳欣
  • 注册排名10008
  • 经验值10
  • 级别
  • 主题2
  • 回复0
楼主
JavaScript 是一种弱类型语言,其浮点数的比较会让开发者们遇到一些意外的问题。例如:类似于 0.1 + 0.2 === 0.3 的比较通常会返回 false。因此,本文将深入探究 JavaScript 中浮点数比较的问题,通过大量案例和说明,为读者详细解析这一问题。 在 JavaScript 中,浮点数的比较几乎都涉及到精度问题。例如,0.1 + 0.2 返回的是 0.30000000000000004 而不是 0.3。这是由于内部使用二进制存储的浮点数精度有限,无法无损地存储所有的十进制浮点数。这就需要我们对比较时的精度要求有一个清晰的认识。 下面是一些针对 JavaScript 浮点数比较精度的示例:
// 精度要求极高情况下建议使用 toFixed
0.1 + 0.2 === 0.3 // false
(0.1 + 0.2).toFixed(1) === 0.3.toFixed(1) // true
// 数字过大或过小时会出现精度问题
0.0000001 + 0.0000002 === 0.0000003 // false
(0.0000001 + 0.0000002).toFixed(7) === 0.0000003.toFixed(7) // true
// 浮点数出现了极小的差异
1.0000000000000003 === 1 // true
1.0000000000000007 === 1 // true,但是当大于等于 1.0000000000000008 时返回 false
// 浮点数默认具有toFixed精度控制功能
1.005.toFixed(2) === '1.01' // true
1.09.toFixed(1) === '1.1' // true
1.099.toFixed(1) === '1.1' // true
1.05.toFixed(1) === '1.0' // true
1.051.toFixed(1) === '1.1' // true
// 使用 Number.EPSILON 解决精度问题
function numbersCloseEnoughToEqual(n1, n2) {
return Math.abs(n1 - n2)< Number.EPSILON;
}
numbersCloseEnoughToEqual(0.1 + 0.2, 0.3); // true
上述代码中,我们通过利用 toFixed 来保留指定小数位,来解决比较大的精度问题;另一方面,我们则是运用了 Number.EPSILON 常量,该常量表示一个可忽略的浮点数精度范围(通常是 2^-52),使我们可以通过判定浮点数差异是否足够小来进行比较。 除上述方法外,我们还可以通过 Math.round、Math.floor、Math.ceil 等函数对数值进行舍入,在进行比较时大大降低精度误差。 总之,在 JavaScript 中进行浮点数比较时,我们需要注意比较的精度要求,并且选择合适的方法来进行比较,从而避免出现精度误差的问题。

本文可能转载于网络公开资源,如果侵犯您的权益,请联系我们删除。

本文地址:https://www.pyask.cn/info/1181.html

0
回帖

javascript 浮点数比较 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息