程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

【JS 浮点数比较】使用最小误差比较浮点数

balukai 2025-01-09 10:35:22 文章精选 8 ℃

由于计算机使用的双精度格式来存储浮点数,因此在计算和比较时经常会出现精度丢失而造成一些误判。今天来记录一下如何使用最小误差来比较两个浮点数大小。

es6新增了一个常量作为浮点数最小误差,Numer.EPSILON,这个常量值大小为Math.pow(2,-52),这是浮点数最小精度,小于这个精度,就会被认为无意义了。

因此我们可以利用这个最小误差来比较两个浮点数是否相等,如果小于这个精度就可以认为两个浮点数相等,大于这个精度就认为不想等

比较浮点数大小

/**
 * 比较两个浮点数是否相等
 * 
 * 由于浮点数在计算机中存储的精度问题,直接使用 `==` 或 `===` 进行比较可能会得到不准确的结果。
 * 因此,我们使用 `Math.abs(a - b) < Number.EPSILON` 来比较两个浮点数是否相等。
 * 
 * @param {number} a - 第一个浮点数
 * @param {number} b - 第二个浮点数
 * @returns {boolean} - 如果两个浮点数在一定精度范围内相等,则返回 `true`,否则返回 `false`
 */
function floatingComparison(a, b) {
  // 使用 Math.abs 计算两个浮点数的差的绝对值,并与 Number.EPSILON 进行比较
  // 如果差的绝对值小于 Number.EPSILON,则认为两个浮点数相等,返回 true
  // 否则返回 false
  return Math.abs(a - b) < Number.EPSILON;
}


双精度(64位)格式分为三部分

  1. 符号位:占1位,用于表示浮点数的正负。0表示正数,1表示负数。
  2. 指数位:占11位,用于表示浮点数的指数部分。指数的取值范围是-1022到1023。
  3. 尾数位:占52位,用于表示浮点数的尾数部分。尾数是一个二进制小数,它的小数点在最左边,即1.xxxxxx的形式。


JS里几个数字常量

  • 最小精度|最小误差 Numer.EPSILON(2**-52)
  • 最大数字 Numer.MAX_VALUE (约 2**1024-1)
  • 最大安全数字 Numer.MAX_SAFE_INTEGER (2**53 - 1)
  • 最小数字 Numer.MIN_VALUE(约 2**-1074)
  • 最小安全数字 Numer.MIN_SAFE_INTEGER (-(2**53 - 1))
  • 正无穷大数 Number.POSITIVE_INFINITY
  • 负无穷数 Number.NEGATIVE_INFINITY
最近发表
标签列表