如何划分两个原生JavaScript 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);

通过仅在"0"处转换为数字;结束";,你会损失最小的精度。

更精确

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

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

最新更新