Skip to content

isNearlyEqual function ​

Checks whether two numbers are equal within a tolerance, relative for large numbers and absolute near zero.

ts
import { isNearlyEqual } from 'utils';

Signature ​

ts
export function isNearlyEqual(a: number, b: number, epsilon = 1e-9): boolean

Parameters ​

NameDescription
aThe first number.
bThe second number.
epsilonThe tolerance, relative to the largest magnitude (at least 1). Defaults to 1e-9.

Returns ​

true when the numbers differ by no more than the tolerance.

Example ​

ts
isNearlyEqual(0.1 + 0.2, 0.3); // true
isNearlyEqual(1, 1.1, 0.01); // false

Tests ​

Line coverage: 100 %.

  • ✅ absorbs float noise
  • ✅ detects real differences
  • ✅ takes the defaults

Source ​

src/math/is-nearly-equal.ts (on GitHub)

Source code
ts
/**
 * Checks whether two numbers are equal within a tolerance, relative for large numbers and absolute near zero.
 *
 * @param a - The first number.
 * @param b - The second number.
 * @param epsilon - The tolerance, relative to the largest magnitude (at least 1). Defaults to `1e-9`.
 * @returns `true` when the numbers differ by no more than the tolerance.
 * @example
 * isNearlyEqual(0.1 + 0.2, 0.3); // true
 * isNearlyEqual(1, 1.1, 0.01); // false
 */
export function isNearlyEqual(a: number, b: number, epsilon = 1e-9): boolean {
  return a === b || Math.abs(a - b) <= epsilon * Math.max(1, Math.abs(a), Math.abs(b));
}
Test file
ts
import { isNearlyEqual } from './is-nearly-equal';

describe(isNearlyEqual, () => {
  it('absorbs float noise', () => {
    expect(isNearlyEqual(0.1 + 0.2, 0.3, 1e-9)).toBe(true);
    expect(isNearlyEqual(1e12 + 0.0001, 1e12, 1e-9)).toBe(true);
    expect(isNearlyEqual(5, 5, 1e-9)).toBe(true);
  });

  it('detects real differences', () => {
    expect(isNearlyEqual(0.1, 0.1001, 1e-9)).toBe(false);
    expect(isNearlyEqual(1, 1.1, 0.01)).toBe(false);
    expect(isNearlyEqual(1, 1.1, 0.1)).toBe(true);
  });

  it('takes the defaults', () => {
    expect(isNearlyEqual(0.1 + 0.2, 0.3)).toStrictEqual(isNearlyEqual(0.1 + 0.2, 0.3, 1e-9));
  });
});

Keywords: is, nearly, equal, math, function

Generated from the JSDoc of the sources.