如何对两个原生JavaScript BigInt进行除法并获得十进制结果

时间:2019-01-28 20:31:49

标签: 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

这在本地是不可能的吗?

1 个答案:

答案 0 :(得分:4)

您应该将分子乘以容纳所需的位数,执行除法运算,然后使用普通的浮点除法运算。

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

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

console.log(Number(a * 100n / b) / 100);

仅在“末尾”转换为Number时,您将损失最少的精度。

更精确

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

这是一个简单的示例,使用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)的浏览器。