I'm aware of https://floating-point-gui.de/ and the fact that there are many libraries available to help with big numbers, but I've surprisingly been unable to find anything that handles more than 19 decimal places in the result of a division operation.
I've spent hours trying libraries such as exact-math, decimal.js, bignumber.js, and others.
How would you handle the case below marked with ⭐?
// https://jestjs.io/docs/getting-started#using-typescript
import exactMath from 'exact-math'; // https://www.npmjs.com/package/exact-math
import { Decimal } from 'decimal.js'; // https://github.com/MikeMcl/decimal.js
const testCases = [
// The following cases work in exact-math but fail in Decimal.js:
'9999513263875304671192000009',
'4513263875304671192000009',
'530467119.530467119',
// The following cases fail in both Decimal.js and exact-math:
'1.1998679030467029262556391239', // ⭐ exact-math rounds these 28 decimal places to 17: "1.1998679030467029263000000000"
];
describe('decimals.js', () => {
testCases.forEach((testCase) => {
test(testCase, () => {
expect(new Decimal(testCase).div(new Decimal(1)).toFixed(28)).toBe(testCase); // Dividing by 1 (very simple!)
});
});
});
describe('exact-math', () => {
testCases.forEach((testCase) => {
test(testCase, () => {
expect(exactMath.div(testCase, 1, { returnString: true })).toBe(testCase); // Dividing by 1 (very simple!)
});
});
});
Some of my test cases above didn't make sense (since I shouldn't have expected the outputs to equal the inputs since I was using
.toFixed().Then the real answer was suggested by @James: use the
maxDecimaloption: https://www.npmjs.com/package/exact-math#the-config-maxdecimal-property-usage Or https://mikemcl.github.io/decimal.js/#precision in decimal.js.See the line with ⭐ below.
My test cases pass now. Thanks!
P.S. See https://stackoverflow.com/a/68906367/ for what inspired my code.