Вы должны умножить числитель на количество нужных вам цифр, выполнить деление и затем деление с обычным делением с плавающей запятой.
(Запустить в браузере, поддерживающем BigInt, например, Chrome)
var a = 12340000000000000000n;
var b = 1000000000000000000n;
console.log(Number(a * 100n / b) / 100);
Преобразовав только число в «конец», вы потеряете наименьшую точность.
Больше точности
Если вам нужнос точностью до 16 цифр и требуются десятичные дроби, тогда вам нужно будет выбросить собственную реализацию своего рода API BigDecimal
или использовать существующую.
Вот простойодин использует BigInt
в качестве базового типа в сочетании с конфигурацией, которая определяет, сколько цифр (справа) каждого такого BigInt следует интерпретировать как десятичные дроби (цифры в дробной части).Эта последняя информация будет, например, использоваться для вставки десятичного разделителя при выводе числа в виде строки.
class BigDecimal {
constructor(value) {
let [ints, decis] = String(value).split(".").concat("");
decis = decis.padEnd(BigDecimal.decimals, "0");
this.bigint = BigInt(ints + decis);
}
static fromBigInt(bigint) {
return Object.assign(Object.create(BigDecimal.prototype), { bigint });
}
divide(divisor) { // You would need to provide methods for other operations
return BigDecimal.fromBigInt(this.bigint * BigInt("1" + "0".repeat(BigDecimal.decimals)) / divisor.bigint);
}
toString() {
const s = this.bigint.toString();
return s.slice(0, -BigDecimal.decimals) + "." + s.slice(-BigDecimal.decimals)
.replace(/\.?0+$/, "");
}
}
BigDecimal.decimals = 18; // Configuration of the number of decimals you want to have.
// Demo
var a = new BigDecimal("123456789123456789876");
var b = new BigDecimal( "10000000000000000000");
console.log(a.divide(b).toString());
Опять же, для этого нужен браузер, поддерживающий BigInt
(Chrome на момент написания).