javascript - 如何划分两个 native JavaScript BigInt 并获得小数结果

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

这在本地是不可能的吗?

最佳答案

您应该将分子相乘以容纳您需要的位数,执行除法,然后使用正常的浮点除法进行除法。

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

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

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

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

更精确

如果您需要超过 16 位的精度并且需要小数,那么您需要自己实现一种BigDecimal 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());

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

关于javascript - 如何划分两个 native JavaScript BigInt 并获得小数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54409854/

相关文章:

php - Mysql 中的类型与长度/值

javascript - 创建 JavaScript 数学库中的算术

javascript - 查询/JavaScript : Countdown Timer acting erratically

javascript - 可折叠订单状态表跨度问题

javascript - jQuery jBox 不从 div 加载内容

javascript - 在 JavaScript 中存储非常大的二进制数的最佳方法是什么?

javascript - 无法在 Bootstrap 5 中使用 JavaScript 打开 Modal

64位有符号整数组合乘除运算无溢出

java - 生成 BigInteger 数字然后相乘。

sql-server - T-SQL : Converting NTEXT to VARCHAR to INT/BIGINT