Web3项目代币燃烧:JavaScript浮点数精度丢失问题求解
解决Web3代币销毁金额精度丢失问题
问题核心在于JavaScript的Number类型是双精度浮点数,仅能精确表示2^53以内的整数。你要处理的金额0.29806008728157019乘以1e18后得到的整数(298060087281570190)超出了这个范围,转成浮点数必然丢失精度。不要将字符串金额转为浮点数,全程用字符串处理即可解决。
推荐两种简单可行的方案:
方案一:直接使用Web3内置工具函数
web3.utils.toWei原生支持字符串输入,能精准处理小数转wei的计算,无需手动操作:
const amountStr = "0.29806008728157019"; // 先转成wei字符串,再转成BN对象 const weiBN = web3.utils.toBN(web3.utils.toWei(amountStr, 'ether'));
方案二:手动字符串处理(适合自定义小数位数场景)
如果需要自定义小数位数,可以手动拆分整数和小数部分,通过字符串拼接得到精确的wei数值:
function strToWei(amountStr, decimals = 18) { const [integerPart, fractionalPart = ''] = amountStr.split('.'); // 补零到指定小数位数,超出部分截断(这里你的场景刚好补1个零) const paddedFraction = fractionalPart.padEnd(decimals, '0').slice(0, decimals); // 拼接成完整整数字符串,去除前导零 let weiStr = `${integerPart}${paddedFraction}`; weiStr = weiStr.replace(/^0+/, '') || '0'; return web3.utils.toBN(weiStr); } // 使用示例 const weiBN = strToWei("0.29806008728157019");
两种方案都不会丢失精度,因为全程未将金额转为浮点数,完全基于字符串操作完成计算。
内容的提问来源于stack exchange,提问作者Ghost
相关产品推荐
相关产品推荐

