The type allows to explicitely define precision in contracts/interfaces.
import { Decimal } from '@ssense/number-utils';
export interface OrderTaxes {
code: string;
rate: Decimal<6>;
totalAmount: Decimal<2>;
details: {
rate: Decimal<6>;
name: string;
amount: Decimal<2>;
}[];
}
Why use this function: Naive implementations like parseFloat(num.toFixed(2))
will lead to rounding inconsistencies. eg. parseFloat(436.905.toFixed(2)) = 436.90 instead of 436.91
ToDecimal rounds precisely by acounting for floating point arithmetic inconsistencies. It returns Decimal.
import { NumberUtils } from '@ssense/number-utils';
const subtotal = 75;
const taxRate = 0.14975;
const total = subtotal * (1 + taxRate); // 89.8125
// We cant charge less than 1 cent, hence, the total has to be rounded
const displayedTotal = NumberUtils.toDecimal<2>(total, 2); // 89.81
If interested in learning more on how this works:
- This guide covers Floating-Point Arithmetic
- This stackoverflow answer shows concrete examples