Additional numbers that you need are not missed if you use a different base, for example. 2 (binary) in the call toString. You can then pass this line to a library with arbitrary precision, such as decimal.js, and fine -tune it from there.
const Decimal = require('decimal.js')
const x = Number.MAX_VALUE
console.log(new Decimal('0b' + x.toString(2)).toString())
This gives the line:
1.79769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368e + 308
. :
new Decimal('0b' + Number.EPSILON.toString(2)).toString()
2.220446049250313080847263336181640625e-16
, new Decimal(Number.MAX_VALUE).toString() . BigInteger.js. . , , . .