Solidity
如何在 Truffle 框架中將 BigNumber 轉換為 Number?
我編寫了一個 ERC20 代幣合約,並使用 truffle 框架將其部署在測試網路中。當我使用 web3 檢查帳戶的令牌餘額時,當我嘗試使用 toNumber() 將其轉換為數字時,它在 BigNumber 中給出了結果,得到了意外的結果。
堅固性程式碼:
function balanceOf(address _from) constant public returns (uint256 balance) { return balances[_from]; }
Javascript程式碼:
instantiateBalance() { const contract = require('truffle-contract') const token = contract(Token) token.setProvider(this.state.web3.currentProvider) var tokenInstance; token.deployed().then(function(instance) { tokenInstance = instance; return tokenInstance.balanceOf.call("0xb1Cf866ced575FD1A1997Daa5d6F099efb282E41", {from: "0xb1Cf866ced575FD1A1997Daa5d6F099efb282E41"}); }).then(function(balance) { console.log(balance.toNumber()); })
預期結果
小數 = 18
實際代幣餘額 = 100000000.000000000000000000
實際結果
代幣餘額 = 1000000000000
如果您的代幣有 18 位小數
就像你可以使用的乙太一樣
then(function(balance) { console.log(web3.fromWei(balance.toNumber(), "ether" ) ); })
使用fromWei將您的 bigNumber 轉換為 ether,然後將其轉換為 Number。請注意,浮點數後面不需要的 0 不會顯示。
在 web3 ^1.0 中,它可能會更改為
web3.utils.fromWei
而不是web3.fromWei
doc。請注意,truffle ^5.0 使用 web3 ^1.0。如果您有不同的令牌小數
假設 6。您必須手動進行轉換,例如:
var tokenBalance = balance.ToNumber() / Math.pow(10, tokenDecimals)