Arbitrary-precision Decimal (Light)
decimal.js-light is an arbitrary-precision Decimal type for JavaScript, currently at stable version 2.5.1. It is a 'light' version of the more comprehensive `decimal.js` library, specifically optimized for a smaller footprint (12.7 KB minified compared to `decimal.js`'s 32.1 KB). This reduction in size comes with specific tradeoffs: it does not support `NaN`, `Infinity`, or `-0` as legitimate values, nor does it handle numbers in bases other than 10. A key difference in behavior is its approach to rounding; arithmetic operations such as division are truncated at the required precision by default, unlike `decimal.js` where a global rounding mode can apply to such operations. Explicit rounding methods like `toDecimalPlaces` must be called to achieve rounded results. Furthermore, transcendental functions like `naturalExponential`, `naturalLogarithm`, `logarithm`, and `toPower` have a default precision limited to about 100 digits, which can be extended by configuring the `LN10` property. The library also distinguishes its internal `e` property (base 10000000 exponent) from the `exponent()` method (base 10 exponent). The project appears to be actively maintained, with regular updates. It provides TypeScript type declarations.
Common errors
-
TypeError: Decimal is not a constructor
cause Attempting to use `Decimal` without properly importing or requiring it, or using an incorrect ESM import syntax for a CommonJS default export.fixFor Node.js CommonJS, use `const Decimal = require('decimal.js-light');`. For environments supporting ESM with bundlers (like Webpack or Rollup), use `import Decimal from 'decimal.js-light';`. -
RangeError: Argument 'NaN' must be a valid number
cause Passing `NaN`, `Infinity`, or `-0` as a value to the Decimal constructor or any method. `decimal.js-light` explicitly disallows these values.fixEnsure all input values are finite base-10 numbers. If `NaN`, `Infinity`, or `-0` support is required, consider using the full `decimal.js` library. -
Unexpected truncated result from arithmetic operation (e.g., division)
cause Arithmetic operations like `dividedBy` are truncated, not rounded, by default in `decimal.js-light`.fixApply explicit rounding after arithmetic operations using methods like `toDecimalPlaces()`. For example: `x.dividedBy(y).toDecimalPlaces(19).toString()`.
Warnings
- breaking Unlike `decimal.js`, this library does not support `NaN`, `Infinity`, `-0`, or operations with values in bases other than 10. Attempting to use these can lead to unexpected behavior or errors.
- gotcha Arithmetic operations (e.g., `dividedBy`) are truncated by default at the required precision. Explicit rounding via `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision`, or `toSignificantDigits` is required to achieve rounded results, unlike `decimal.js` where `Decimal.round` can apply to arithmetic.
- gotcha Methods like `naturalExponential`, `naturalLogarithm`, `logarithm`, and `toPower` have a default precision limit of approximately 100 digits. This can lead to unexpected loss of precision for high-precision calculations.
- gotcha The `e` property of a `Decimal` instance represents the base 10000000 exponent, not the base 10 exponent as in `decimal.js`. To get the base 10 exponent, use the `exponent()` method.
Install
-
npm install decimal.js-light -
yarn add decimal.js-light -
pnpm add decimal.js-light
Imports
- Decimal
var Decimal = require('decimal.js-light'); - Decimal
import { Decimal } from 'decimal.js-light';import Decimal from 'decimal.js-light';
- Decimal
import type { Decimal } from 'decimal.js-light';
Quickstart
// Node.js
var Decimal = require('decimal.js-light');
// Adjust the global configuration if required (these are the defaults)
Decimal.set({
precision: 20,
rounding: Decimal.ROUND_HALF_UP,
toExpNeg: -7,
toExpPos: 21
});
const phi = new Decimal('1.61803398874989484820458683436563811772030917980576');
console.log(phi.toFixed(10)); // Outputs: '1.6180339887'
console.log(phi.times(2).minus(1).toPower(2).plus('1e-19').equals(5)); // Outputs: true