Effortless fixed-point math in TypeScript powered by WASM.
npm install @gud/math
# or
yarn add @gud/math
import { fixed, parseFixed } from "@gud/math";
const principal = fixed(1_000_123456789012345678n);;
const rate = parseFixed(0.025); // parse unscaled values
const interest = principal.mulDown(rate);
const total = principal.add(interest);
console.log(total.bigint);
// => 1025126543208737654319n
console.log(total.toNumber());
// => 1025.1265432087378
console.log(total.toString()); // or console.log(`${total}`)
// => "1025.126543208737654319"
console.log(total.format({ decimals: 4 }))
// => "1,025.1265"
console.log(total.formatCurrency())
// => "$1,025.13"
By default, all fixed-point numbers are created with 18 decimal places, but this can be changed by
passing a second argument to the fixed
and parseFixed
functions.
const n = fixed(1500000n, 6);
console.log(n.bigint, n.toString());
// => 1500000n "1.500000"
const n2 = parseFixed(0.025, 6);
console.log(n2.bigint, n2.toString());
// => 25000n "0.025000"
Use fixed
with values that are already scaled.
const totalSupply = 22950342684077248430458n;
const sharePrice = 1094205545459194143n;
const totalSupplyInBase = fixed(totalSupply).mulDown(sharePrice);
console.log(`Total supply in base: ${totalSupplyInBase.bigint}`);
// => "Total supply in base: 25112392235106171381320"
const fromBigint = fixed(1500000000000000000n);
const fromNumber = fixed(1.5e18);
const fromString = fixed("1.5e18");
const withDecimals = fixed(1.5e6, 6);
console.log(fromBigint.toString());
// => "1.500000000000000000"
console.log(fromNumber.toString());
// => "1.500000000000000000"
console.log(fromString.toString());
// => "1.500000000000000000"
console.log(withDecimals.toString());
// => "1.500000"
Use parseFixed
with unscaled decimal values.
const principal = "1_000.123456789012345678";
const rate = 0.025;
const interest = parseFixed(principal).mulUp(parseFixed(rate));
console.log(`Interest: ${interest}`);
// => "Interest: 25.003086419725308642"
const fromNumber = parseFixed(1.5);
const fromString = parseFixed("1.5");
const withDecimals = parseFixed("1.5", 6);
console.log(fromNumber.toString());
// => "1.500000000000000000"
console.log(fromString.toString());
// => "1.500000000000000000"
console.log(withDecimals.toString());
// => "1.500000"
Use randomFixed
to generate a random fixed-point number.
let rand = randomFixed({
min: 1e18,
max: 100e18,
});
console.log(`Random: ${rand}`);
// => "Random: 69.357623681464768420"