如何将两个原生 JavaScript BigInt 相除并得到十进制结果

rob*_*sio 10 javascript biginteger bigint

这是我迄今为止尝试过的。我想得到一个12.34

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

12n

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

12

FWIW,当我使用 JSBI 库时,它的工作方式是我想要的:

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

12.34

这在本地是不可能的吗?

tri*_*cot 18

您应该乘以分子以容纳您需要的位数,执行除法,然后用普通浮点除法进行除法。

(在支持 BigInt 的浏览器中运行,如 Chrome)

var a = 12340000000000000000n;
var b =  1000000000000000000n;

console.log(Number(a * 100n / b) / 100);
Run Code Online (Sandbox Code Playgroud)

通过仅在“结束”转换为 Number,您将损失最少的精度。

更精准

如果您需要超过 16 位的精度并且需要小数,那么您需要抛出自己的一种BigDecimalAPI 实现,或者使用现有的API。

这是一个简单的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().padStart(BigDecimal.decimals+1, "0");
        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());
Run Code Online (Sandbox Code Playgroud)

同样,这需要一个支持BigInt(在撰写本文时为 Chrome)的浏览器。

  • 仅供参考,我有一个带有加、减、乘和舍入的版本作为 [JavaScript 中的 BigDecimal](/sf/answers/4685747111/) 的答案。 (2认同)