Awesome Open Source
Awesome Open Source

BigFloat

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 the Google Chrome Labs' implementation of ECMAScript big integers: JSBI.

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

NOTE: This is a compatibility package intended for cross-browser support. If you are targetting Node.js, Electron or any engine that supports native bigints and the exponentiation operator(**), then you don't need JSBI and you should be using bigfloat-esnext.

Basic usage

Functional style

import { make, string, sqrt } from "bigfloat.js";

string(sqrt(make("2")));               // "1.4142"

Class based

import { BigFloat } from "bigfloat.js";

new BigFloat("2").sqrt().toString();   // "1.4142"

The evaluate() function

evaluate(expression: string, precision?: number): string | boolean

The first argument can be any valid arithmetic or relational expression, including scientific e-notation. (Optional) Precision should be a negative integer. Default is -4.

import { evaluate } from "bigfloat.js";

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 ===,==,!==,!=,<,>,<=,>=

Change precision

import { BigFloat, set_precision } from "bigfloat.js";

new BigFloat(2).sqrt().toString();     // "1.4142"
set_precision(-10);
new BigFloat(2).sqrt().toString();     // "1.4142135623"

The bigfloat object

interface IBigFloat {
  coefficient: JSBI;
  exponent: number;
}

Valid bigfloat made from primitives:

const bigfloat: IBigFloat {
  coefficient: JSBI.BigInt(522299),
  exponent: -4
};


Alternative Project Comparisons
Related Awesome Lists
Top Programming Languages

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Typescript (306,134
Mathematics (10,277
Cryptocurrency (8,176
Business (6,008
Physics (5,354
Arithmetic (1,933
Floating Point (295
Bigdecimal (218
Arbitrary Precision (191
Bignumber (179
Decimal (152
Precision (143
Bigint (103
Bigfloat (12