BigInt的javascript

时间:2019-06-21 03:27:00

标签: javascript

例如,我想找到一个大数所有整数的总和

power(99,95)

我使用bigInt来获得大数幂,并通过以下代码将其求和。

BigInt(Math.pow(99,95)).toString().split('').reduce(function(a,b){return a*1+b*1})

但是,它返回845。​​但是正确的答案应该是972。

我检查了javascript中大数的整数输出是

3848960788934848488282452569509484590776195611314554049114673132510910096787679715604422673797115451807631980373077374162416714994207463122539142978709403811688831410945323915071533162168320

与正确答案(在C#中)不同

3848960788934848611927795802824596789608451156087366034658627953530148126008534258032267383768627487094610968554286692697374726725853195657679460590239636893953692985541958490801973870359499

我想知道代码中出了什么问题导致差异?

2 个答案:

答案 0 :(得分:3)

表达式Math.pow(99, 95)解析后,已经失去了精度-在事实无法恢复丢失的精度后将其强制转换为BigInt。

从一开始就使用BigInts,然后使用**而不是Math.pow,以便进行幂运算:

console.log(
  (99n ** 95n)
    .toString()
    .split('')
    .reduce((a, b) => a + Number(b), 0)
);

答案 1 :(得分:1)

BigInt(Math.pow(99,95))

这会在2个浮点上运行数学pow,然后将其转换为bigint。

您要改为BigInt(99) ** BigInt(95)