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): booleanParameters
| Name | Description |
|---|---|
a | The first number. |
b | The second number. |
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
ts
isNearlyEqual(0.1 + 0.2, 0.3); // true
isNearlyEqual(1, 1.1, 0.01); // falseTests
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