【问题标题】: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 类型,您可以:
- 将其转换为
String
- 添加小数点
- 使用原生函数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);