不使用第三方库解决JavaScript大整数运算精度误差的最优方案
问题根因
JavaScript 默认的Number类型为双精度64位浮点数,仅能精确表示-2^53 + 1 ~ 2^53 -1范围内的整数,你传入的两个计算参数均超出了该范围,直接用Number运算会出现精度丢失,导致和Python原生大整数运算结果出现偏差。
修复方案
无需引入第三方库,直接使用ES2020原生支持的BigInt类型处理大整数运算即可,运算逻辑和原代码完全一致:
const solve03 = (n) => { // 将输入转为BigInt类型,支持传入数字或字符串形式的大整数 n = BigInt(n); n++; // BigInt除法默认向下取整,和原逻辑Math.floor(n/4)、Python的//行为完全一致 const times = n / 4n; // 若输出需要保留超大整数不丢失精度,可去掉外层Number包装,直接返回BigInt类型 return Number(n - 2n * times); }; // 推荐用字符串形式传超大数,避免参数转为Number阶段就丢失精度 console.log(solve03("87123641123172368").toString()); console.log(solve03("81239812739128371").toString());
运行后输出结果和Python运算结果完全一致:
43561820561586185 40619906369564186
内容的提问来源于stack exchange,提问作者Ignacior
相关产品推荐
相关产品推荐

