Как разделить два встроенных JavaScript-кода BigInt и получить десятичный результат - PullRequest
0 голосов
/ 28 января 2019

Вот что я пробовал до сих пор.Я жду, чтобы получить 12.34:

BigInt('12340000000000000000') / BigInt('1000000000000000000')

12n

Number(BigInt('12340000000000000000') / BigInt('1000000000000000000'))

12

FWIW, когда я использую библиотеку JSBI, она работает так, как мне бы хотелось:

JSBI.BigInt('12340000000000000000') / JSBI.BigInt('1000000000000000000');

12.34

Разве это не возможно изначально?

1 Ответ

0 голосов
/ 28 января 2019

Вы должны умножить числитель на количество нужных вам цифр, выполнить деление и затем деление с обычным делением с плавающей запятой.

(Запустить в браузере, поддерживающем 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 на момент написания).

...