【问题标题】:Web3.js get the "human readable value" balance for a contract and walletWeb3.js 获取合约和钱包的“人类可读值”余额
【发布时间】:2022-11-11 04:19:19
【问题描述】:

我有一个真正的大脑放屁自动取款机。我在接受钱包的合约上有一个简单的 getBalance 函数。这将返回余额,但如您所知,它是余额的 BigNumber,不考虑小数。那我怎么转:

806179086037007

进入 806179.086037007

此给定合约的小数点为 9。

const contract = new web3.eth.Contract(minABI, contractName);
const decimals = await contract.methods.decimals().call();
const balance = await contract.methods
                .balanceOf(address)
                .call();

我尝试了各种我在网上找到的解决方案,但似乎无法获得我想要的价值。

【问题讨论】:

    标签: javascript ethereum web3js


    【解决方案1】:

    JavaScript 无法安全地将这个大数字表示为原生类型 Number,因此 web3js 使用 BigNumber 代替。

    如果您想不安全地将较大的数字转换为带有小数的原生 Number 类型,您可以:

    1. 将其转换为String
    2. 添加小数点
    3. 使用原生函数parseFloat()

      但请注意,它可能会导致舍入错误,因为 JS 在不同的浏览器及其版本/NodeJS 版本/处理器架构/等中使用数字略有不同。

      const balance = new web3.utils.BN("806179086037007");
      const decimals = 9;
      
      const balanceString = balance.toString();
      
      // builds the String "806179.086037007"
      const balanceStringWithDecimalPoint = [
          balanceString.slice(0, balanceString.length - decimals), 
          ".",
          balanceString.slice(balanceString.length - decimals)
      ].join("");
      
      
      const nativeNumberUnsafe = Number.parseFloat(balanceStringWithDecimalPoint);
      console.log(nativeNumberUnsafe);
      

    【讨论】:

      猜你喜欢
      • 2018-05-04
      • 2021-03-23
      • 2022-08-13
      • 2019-10-11
      • 1970-01-01
      • 2022-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多