@yaffle/bigdecimal
v2.0.2
Published
Arbitrary precision decimal arithmetic library. Polyfill for decimal proposal. Implemented on the top of BigInt.
Downloads
32
Maintainers
Readme
BigDecimal
a polyfill for decimal propocal - https://github.com/tc39/proposal-decimal It is implemented on the top of native BigInt. It can be compiled using https://www.npmjs.com/package/babel-plugin-transform-bigint to use JSBI.
Usage:
Installation:
npm install @yaffle/bigdecimal
Type conversion:
BigDecimal.BigDecimal(string)
BigDecimal.BigDecimal(bigint)
BigDecimal.BigDecimal(number) // (only integers)
a.toString()
a.toFixed(fractionDigits[, roundingMode = "half-up"])
a.toPrecision(precision[, roundingMode = "half-up"])
a.toExponential(fractionDigits[, roundingMode = "half-up"])
Arithmetic:
BigDecimal.unaryMinus(a)
BigDecimal.add(a, b[, rounding])
BigDecimal.subtract(a, b[, rounding])
BigDecimal.multiply(a, b[, rounding])
BigDecimal.divide(a, b, rounding)
BigDecimal.round(a, rounding)
Comparison:
BigDecimal.cmp(a, b)
Math: (not in the spec)
To use:
import addMath from './BigDecimalMath.js';
addMath(BigDecimal, 10);
BigDecimal.abs(a)
BigDecimal.sign(a)
BigDecimal.max(a, b)
BigDecimal.min(a, b)
BigDecimal.log(a, rounding)
BigDecimal.exp(a, rounding)
BigDecimal.sin(a, rounding)
BigDecimal.cos(a, rounding)
BigDecimal.atan(a, rounding)
BigDecimal.sqrt(a, rounding)
The rounding
argument may look like {maximumFractionDigits: 10, roundingMode: "half-even"}
or {maximumSignificantDigits: 10, roundingMode: "half-even"}
,
where the roundingMode
can be:
"floor"
"down"
"ceil"
"up"
"half-even"
"half-up"
"half-down"
.
BigFloat
Similar to BigDecimal, but uses base 2.
Example:
import {BigDecimal} from "./node_modules/@yaffle/bigdecimal/BigDecimal.js";
const rounding = {maximumSignificantDigits: 1000, roundingMode: "half-even"};
let pi = BigDecimal.multiply(BigDecimal.BigDecimal(4), BigDecimal.atan(BigDecimal.BigDecimal(1), rounding));
console.log(pi.toString());
Note:
- Consider to use only "half-even" rounding mode and rounding to a maximum number of significant digits for floating-point arithmetic, or only "floor" rounding to a maximum number of fraction digits for fixed-point arithmetic.
- For the best performance use BigFloat and rounding like {maximumFractionDigits: number, roundingMode: "floor"}.
- Use to round to an integer
BigDecimal.round(a, {maximumFractionDigits: 0, roundingMode: "half-even"})
.
Similar projects:
- https://github.com/MikeMcl/decimal.js/ (decimal)
- https://github.com/uzyn/bigdenary (decimal)
- https://github.com/MikeMcl/big.js/ (decimal)
- https://github.com/MikeMcl/bignumber.js/ (decimal)
- https://github.com/davidmartinez10/bigfloat#readme (decimal)
- https://github.com/plow-technologies/bs-Zarith (decimal)
- https://github.com/royNiladri/js-big-decimal (decimal)
- https://github.com/charto/bigfloat (binary)
- https://github.com/munsocket/jampary (binary)
- ...
Benchmark results:
Results of running the benchmark from https://github.com/munsocket/jampary#early-stage-results-without-wasm-and-fma :
| library | time | |--------------|---------| | Jampary_Wasm | 466 ms | | Jampary | 204 ms | | BigNumberJs | 263 ms | | DecimalJs | 424 ms | | BigFloat | 85 ms | | BigDecimal | 135 ms | | BigJs | 3403 ms | | BigFloat32 | 158 ms |