A library for arbitrary precision decimal floating point arithmetic that can exactly represent all decimal fractions, unlike JavaScript's number data type which is 64-bit binary floating point.
Based on the original work by Douglas Crockford. This implementation is built upon ES native bigints.
This library provides three ways to make bigfloat operations:
- A set of functions for a functional style approach
- A BigFloat class with an API similar to that of Decimal.js
- An evaluate() function that parses and resolves an expression
import { make, string, sqrt } from "bigfloat-esnext"; string(sqrt(make("2"))); // "1.4142"
import { BigFloat } from "bigfloat-esnext"; new BigFloat("2").sqrt().toString(); // "1.4142"
evaluate(expression: string, precision?: number): string | boolean
The first argument can be any valid arithmetic or relational expression, including scientific e-notation. Precision should be a negative integer. Default is -4.
import { evaluate } from "bigfloat-esnext"; 0.1 + 0.2 === 0.3; // false evaluate("0.1 + 0.2 == 0.3"); // true 0.1 + 0.2; // 0.30000000000000004 evaluate("0.1 + 0.2"); // "0.3" 1 + Number.EPSILON / 2; // 1 evaluate(`1 + ${Number.EPSILON / 2}`); // "1.00000000000000011102230246251565" evaluate("1 + 2.220446049250313e-16"); // "1.0000000000000002220446049250313" evaluate(`4 >= ${Math.PI}`); // true
Valid tokens:
- Parenthesis: (,)
- Number: Decimal, integer or scientific e-notation
- Operator: Arithmetic +,-,/,*,** Relational ===,==,!==,!=,<,>,<=,>=
import { BigFloat, set_precision } from "bigfloat-esnext"; new BigFloat(2).sqrt().toString(); // "1.4142" set_precision(-10); new BigFloat(2).sqrt().toString(); // "1.4142135623"
interface IBigFloat { coefficient: bigint; exponent: number; }
Valid bigfloat made from primitives:
const bigfloat: IBigFloat { coefficient: 522299n, exponent: -4 };