Convert Figma logo to code with AI

MikeMcl logodecimal.js

An arbitrary-precision Decimal type for JavaScript

6,813
489
6,813
15

Top Related Projects

14,832

An extensive math library for JavaScript and Node.js

5,038

A small, fast JavaScript library for arbitrary-precision decimal arithmetic.

A JavaScript library for arbitrary-precision decimal and non-decimal arithmetic

An arbitrary length integer library for Javascript

Quick Overview

Decimal.js is a JavaScript library that provides an arbitrary-precision decimal type for performing arithmetic operations. It offers a solution for precise calculations, especially when dealing with financial or scientific computations where floating-point arithmetic can lead to inaccuracies.

Pros

  • Arbitrary-precision decimal arithmetic
  • Supports large numbers and small decimals with high accuracy
  • Configurable rounding modes and precision
  • Comprehensive API with many mathematical operations

Cons

  • Slower performance compared to native JavaScript number operations
  • Increased memory usage for large numbers or high precision
  • Learning curve for developers used to native JavaScript number handling
  • Potential overhead for simple calculations that don't require high precision

Code Examples

Example 1: Basic arithmetic

import Decimal from 'decimal.js';

const a = new Decimal(0.1);
const b = new Decimal(0.2);
const sum = a.plus(b);
console.log(sum.toString()); // Outputs: '0.3'

Example 2: Precision control

Decimal.set({ precision: 20 });
const result = new Decimal(1).dividedBy(3);
console.log(result.toString()); // Outputs: '0.33333333333333333333'

Example 3: Complex calculations

const x = new Decimal('123456.789');
const y = new Decimal('0.12345');
const result = x.times(y).sqrt().toDecimalPlaces(4);
console.log(result.toString()); // Outputs: '38.7307'

Getting Started

  1. Install the library:

    npm install decimal.js
    
  2. Import and use in your JavaScript code:

    import Decimal from 'decimal.js';
    
    const x = new Decimal(10);
    const y = new Decimal(3);
    const result = x.dividedBy(y);
    
    console.log(result.toString()); // Outputs: '3.3333333333333333333'
    
  3. Configure global settings (optional):

    Decimal.set({ precision: 5, rounding: Decimal.ROUND_DOWN });
    

Competitor Comparisons

14,832

An extensive math library for JavaScript and Node.js

Pros of mathjs

  • Comprehensive mathematical library with a wide range of functions
  • Supports complex numbers, matrices, and units
  • Extensible with custom functions and data types

Cons of mathjs

  • Larger file size and potentially slower performance for basic operations
  • May be overkill for projects that only need decimal arithmetic
  • Less specialized in arbitrary-precision decimal calculations

Code Comparison

decimal.js:

import Decimal from 'decimal.js';
const result = new Decimal('0.1').plus('0.2');
console.log(result.toString()); // '0.3'

mathjs:

import * as math from 'mathjs';
const result = math.add(math.bignumber('0.1'), math.bignumber('0.2'));
console.log(result.toString()); // '0.3'

Summary

decimal.js is a specialized library for arbitrary-precision decimal arithmetic, offering high performance and accuracy for decimal calculations. It's lightweight and focused on decimal operations.

mathjs is a more comprehensive mathematics library that includes decimal arithmetic along with many other mathematical functions and features. It's suitable for projects requiring a wide range of mathematical operations but may be less efficient for simple decimal calculations.

Choose decimal.js for projects focused on precise decimal arithmetic, and mathjs for those needing a broader set of mathematical tools and functions.

5,038

A small, fast JavaScript library for arbitrary-precision decimal arithmetic.

Pros of big.js

  • Smaller file size and faster performance for basic arithmetic operations
  • Simpler API with fewer methods, making it easier to learn and use
  • Better suited for financial calculations and scenarios where decimal precision is crucial

Cons of big.js

  • Limited functionality compared to decimal.js (e.g., no trigonometric or exponential functions)
  • Less precise for very large numbers or complex mathematical operations
  • Lacks some advanced features like custom rounding modes and configurable precision

Code Comparison

big.js:

const x = new Big(0.1);
const y = x.plus(0.2);
console.log(y.toString()); // '0.3'

decimal.js:

const x = new Decimal(0.1);
const y = x.plus(0.2);
console.log(y.toString()); // '0.3'

Both libraries provide similar basic functionality for arithmetic operations. However, decimal.js offers more advanced mathematical functions:

const x = new Decimal(2);
console.log(x.sqrt().toString()); // '1.4142135623730950488'

big.js doesn't have built-in support for square root calculations, requiring custom implementations for such operations.

A JavaScript library for arbitrary-precision decimal and non-decimal arithmetic

Pros of bignumber.js

  • Smaller file size and faster performance for basic arithmetic operations
  • Simpler API with fewer methods, making it easier to learn and use
  • Better suited for financial calculations and scenarios where decimal precision is crucial

Cons of bignumber.js

  • Lacks advanced mathematical functions (e.g., trigonometric, exponential) that decimal.js provides
  • Does not support complex numbers or additional number types
  • Limited configuration options compared to decimal.js

Code Comparison

bignumber.js:

const x = new BigNumber('123.456789');
const y = new BigNumber('0.1');
const result = x.plus(y).toFixed(2);

decimal.js:

const x = new Decimal('123.456789');
const y = new Decimal('0.1');
const result = x.plus(y).toFixed(2);

Both libraries provide similar basic functionality for arithmetic operations. However, decimal.js offers more advanced mathematical functions:

const x = new Decimal('2');
const result = Decimal.sin(x); // Trigonometric function

bignumber.js focuses on basic arithmetic and is well-suited for financial calculations, while decimal.js offers a broader range of mathematical operations and configuration options. Choose based on your specific needs and performance requirements.

An arbitrary length integer library for Javascript

Pros of BigInteger.js

  • Specialized for integer arithmetic, potentially offering better performance for whole number operations
  • Simpler API, focusing solely on integer operations
  • Smaller library size, which may lead to faster load times in web applications

Cons of BigInteger.js

  • Limited to integer operations, lacking support for decimal arithmetic
  • Less comprehensive documentation compared to decimal.js
  • Fewer advanced mathematical functions and operations available

Code Comparison

BigInteger.js:

var a = BigInteger("123456789");
var b = BigInteger("987654321");
var sum = a.add(b);
var product = a.multiply(b);

decimal.js:

var a = new Decimal("123456789");
var b = new Decimal("987654321");
var sum = a.plus(b);
var product = a.times(b);

Both libraries provide similar basic arithmetic operations, but decimal.js offers more extensive functionality for decimal arithmetic and advanced mathematical operations. BigInteger.js is more focused on integer-specific operations and may be a better choice for applications that only require whole number calculations. decimal.js provides a more comprehensive solution for general-purpose arbitrary-precision arithmetic, including both integer and decimal operations.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

decimal.js

An arbitrary-precision Decimal type for JavaScript.

npm version npm downloads CDNJS


Features

  • Integers and floats
  • Simple but full-featured API
  • Replicates many of the methods of JavaScript's Number.prototype and Math objects
  • Also handles hexadecimal, binary and octal values
  • Faster, smaller, and perhaps easier to use than JavaScript versions of Java's BigDecimal
  • No dependencies
  • Wide platform compatibility: uses JavaScript 1.5 (ECMAScript 3) features only
  • Comprehensive documentation and test set
  • Used under the hood by math.js
  • Includes a TypeScript declaration file: decimal.d.ts

API

The library is similar to bignumber.js, but here precision is specified in terms of significant digits rather than decimal places, and all calculations are rounded to the precision (similar to Python's decimal module) rather than just those involving division.

This library also adds the trigonometric functions, among others, and supports non-integer powers, which makes it a significantly larger library than bignumber.js and the even smaller big.js.

For a lighter version of this library without the trigonometric functions see decimal.js-light.

Load

The library is the single JavaScript file decimal.js or ES module decimal.mjs.

Browser:

<script src='path/to/decimal.js'></script>

<script type="module">
  import Decimal from './path/to/decimal.mjs';
  ...
</script>

Node.js:

npm install decimal.js
const Decimal = require('decimal.js');

import Decimal from 'decimal.js';

import {Decimal} from 'decimal.js';

Use

In all examples below, semicolons and toString calls are not shown. If a commented-out value is in quotes it means toString has been called on the preceding expression.

The library exports a single constructor function, Decimal, which expects a single argument that is a number, string or Decimal instance.

x = new Decimal(123.4567)
y = new Decimal('123456.7e-3')
z = new Decimal(x)
x.equals(y) && y.equals(z) && x.equals(z)        // true

If using values with more than a few digits, it is recommended to pass strings rather than numbers to avoid a potential loss of precision.

// Precision loss from using numeric literals with more than 15 significant digits.
new Decimal(1.0000000000000001)         // '1'
new Decimal(88259496234518.57)          // '88259496234518.56'
new Decimal(99999999999999999999)       // '100000000000000000000'

// Precision loss from using numeric literals outside the range of Number values.
new Decimal(2e+308)                     // 'Infinity'
new Decimal(1e-324)                     // '0'

// Precision loss from the unexpected result of arithmetic with Number values.
new Decimal(0.7 + 0.1)                  // '0.7999999999999999'

As with JavaScript numbers, strings can contain underscores as separators to improve readability.

x = new Decimal('2_147_483_647')

String values in binary, hexadecimal or octal notation are also accepted if the appropriate prefix is included.

x = new Decimal('0xff.f')            // '255.9375'
y = new Decimal('0b10101100')        // '172'
z = x.plus(y)                        // '427.9375'

z.toBinary()                         // '0b110101011.1111'
z.toBinary(13)                       // '0b1.101010111111p+8'

// Using binary exponential notation to create a Decimal with the value of `Number.MAX_VALUE`.
x = new Decimal('0b1.1111111111111111111111111111111111111111111111111111p+1023')
// '1.7976931348623157081e+308'

Decimal instances are immutable in the sense that they are not changed by their methods.

0.3 - 0.1                     // 0.19999999999999998
x = new Decimal(0.3)
x.minus(0.1)                  // '0.2'
x                             // '0.3'

The methods that return a Decimal can be chained.

x.dividedBy(y).plus(z).times(9).floor()
x.times('1.23456780123456789e+9').plus(9876.5432321).dividedBy('4444562598.111772').ceil()

Many method names have a shorter alias.

x.squareRoot().dividedBy(y).toPower(3).equals(x.sqrt().div(y).pow(3))     // true
x.comparedTo(y.modulo(z).negated() === x.cmp(y.mod(z).neg())              // true

Most of the methods of JavaScript's Number.prototype and Math objects are replicated.

x = new Decimal(255.5)
x.toExponential(5)                       // '2.55500e+2'
x.toFixed(5)                             // '255.50000'
x.toPrecision(5)                         // '255.50'

Decimal.sqrt('6.98372465832e+9823')      // '8.3568682281821340204e+4911'
Decimal.pow(2, 0.0979843)                // '1.0702770511687781839'

// Using `toFixed()` to avoid exponential notation:
x = new Decimal('0.0000001')
x.toString()                             // '1e-7'
x.toFixed()                              // '0.0000001'

And there are isNaN and isFinite methods, as NaN and Infinity are valid Decimal values.

x = new Decimal(NaN)                                           // 'NaN'
y = new Decimal(Infinity)                                      // 'Infinity'
x.isNaN() && !y.isNaN() && !x.isFinite() && !y.isFinite()      // true

There is also a toFraction method with an optional maximum denominator argument.

z = new Decimal(355)
pi = z.dividedBy(113)        // '3.1415929204'
pi.toFraction()              // [ '7853982301', '2500000000' ]
pi.toFraction(1000)          // [ '355', '113' ]

All calculations are rounded according to the number of significant digits and rounding mode specified by the precision and rounding properties of the Decimal constructor.

For advanced usage, multiple Decimal constructors can be created, each with their own independent configuration which applies to all Decimal numbers created from it.

// Set the precision and rounding of the default Decimal constructor
Decimal.set({ precision: 5, rounding: 4 })

// Create another Decimal constructor, optionally passing in a configuration object
Dec = Decimal.clone({ precision: 9, rounding: 1 })

x = new Decimal(5)
y = new Dec(5)

x.div(3)                           // '1.6667'
y.div(3)                           // '1.66666666'

The value of a Decimal is stored in a floating point format in terms of its digits, exponent and sign, but these properties should be considered read-only.

x = new Decimal(-12345.67);
x.d                            // [ 12345, 6700000 ]    digits (base 10000000)
x.e                            // 4                     exponent (base 10)
x.s                            // -1                    sign

For further information see the API reference in the doc directory.

Test

To run the tests using Node.js from the root directory:

npm test

Each separate test module can also be executed individually, for example:

node test/modules/toFraction

To run the tests in a browser, open test/test.html.

Minify

Two minification examples:

Using uglify-js to minify the decimal.js file:

npm install uglify-js -g
uglifyjs decimal.js --source-map url=decimal.min.js.map -c -m -o decimal.min.js

Using terser to minify the ES module version, decimal.mjs:

npm install terser -g
terser decimal.mjs --source-map url=decimal.min.mjs.map -c -m --toplevel -o decimal.min.mjs
import Decimal from './decimal.min.mjs';

Licence

The MIT Licence

NPM DownloadsLast 30 Days