例如,我想找到一个大数所有整数的总和
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
我想知道代码中出了什么问题导致差异?
答案 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)