JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 29
  • Score
    100M100P100Q60550F
  • License MIT

A library for arbitrary precision floating point arithmetic.

Package Exports

  • bigfloat.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (bigfloat.js) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

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
};