如何比较两个wei值?解决ethers.js中balance.lt报错问题
问题
使用ethers.js v6编写NFT余额校验代码时,调用balance.lt(priceInWei)报错TypeError: balance.lt is not a function,直接用<运算符比较也无法得到正确结果。
代码片段
provider = new ethers.BrowserProvider(window.ethereum); signer = await provider.getSigner(); let contract = new ethers.Contract(NFTMarketplaceAddress, Marketplace.abi, signer); const address = await signer.getAddress(); const balance = await provider.getBalance(address); const priceInWei = ethers.parseEther(NFTData.price.toString()); console.log(balance.lt(priceInWei))
报错信息
TypeError: balance.lt is not a function
解决方案
问题根源是混淆了ethers.js v6中BigNumber与FixedNumber的API,且JavaScript原生运算符无法正确处理超大数值:
provider.getBalance()和ethers.parseEther()返回的都是BigNumber类型,你参考的lt()是FixedNumber专属方法,因此调用报错。- 直接用
<比较BigNumber会触发JavaScript的类型转换,当数值超过安全整数范围时,精度丢失导致结果错误。
正确写法
ethers.js v6对BigNumber的比较方法做了语义化命名调整,使用以下方法即可正确校验:
// 检查余额是否小于目标价格 console.log(balance.isLessThan(priceInWei));
其他可用的BigNumber比较方法
- 大于:
balance.isGreaterThan(priceInWei) - 等于:
balance.isEqual(priceInWei) - 小于等于:
balance.isLessThanOrEqual(priceInWei) - 大于等于:
balance.isGreaterThanOrEqual(priceInWei)
内容的提问来源于stack exchange,提问作者S N Sakib
相关产品推荐
相关产品推荐

