Arbitrary-precision Decimal Arithmetic

10.6.0 · active · verified Sun Apr 19

decimal.js is an arbitrary-precision Decimal type for JavaScript, providing robust arithmetic capabilities for numbers that require exact precision, such as financial calculations. Currently at version 10.6.0, it offers a stable and actively maintained solution. Unlike bignumber.js, decimal.js defines precision in terms of significant digits rather than decimal places, aligning with Python's decimal module. It further distinguishes itself by including comprehensive trigonometric functions and support for non-integer powers, making it a more feature-rich (and larger) library than bignumber.js or big.js. The library has no external dependencies and maintains wide platform compatibility by using only ECMAScript 3 features. It ships with TypeScript declaration files, ensuring type safety for modern JavaScript projects.

Common errors

Warnings

Install

Imports

Quickstart

Illustrates initializing Decimal instances from various types and highlights common precision pitfalls with native JavaScript numbers versus Decimal's exact arithmetic.

import Decimal from 'decimal.js';

// Initialize Decimal instances
const x = new Decimal(123.4567);
const y = new Decimal('123456.7e-3');
const z = new Decimal(x);

console.log(`x: ${x}`);
console.log(`y: ${y}`);
console.log(`z: ${z}`);
console.log(`x equals y: ${x.equals(y)}`); // true
console.log(`y equals z: ${y.equals(z)}`); // true

// Demonstrate precision loss with native JavaScript Number literals
console.log('\nDemonstrating native Number precision pitfalls:');
const lossyNumber = new Decimal(1.0000000000000001);
console.log(`new Decimal(1.0000000000000001): ${lossyNumber}`); // Expected '1' (due to JS Number precision)
const largeNumberLoss = new Decimal(99999999999999999999);
console.log(`new Decimal(99999999999999999999): ${largeNumberLoss}`); // Expected '100000000000000000000'

// Arithmetic precision loss
const nativeSum = 0.7 + 0.1;
const decimalSum = new Decimal(0.7).plus(new Decimal(0.1));
console.log(`0.7 + 0.1 (native): ${nativeSum}`); // 0.7999999999999999
console.log(`new Decimal(0.7).plus(new Decimal(0.1)): ${decimalSum}`); // 0.8

view raw JSON →