Wie konvertiere ich BigNumber in Number im Truffle-Framework?

Ich habe einen ERC20-Token-Vertrag geschrieben und ihn im Testnetzwerk mit dem Truffle-Framework bereitgestellt. Wenn ich den Token-Saldo für ein Konto mit web3 überprüfe, wird das Ergebnis in BigNumber angezeigt, wenn ich versuche, es mit toNumber () in eine Zahl umzuwandeln und ein unerwartetes Ergebnis zu erhalten.

Soliditätscode:

  function balanceOf(address _from) constant public returns (uint256 balance) {
    return balances[_from];
}

Javascript-Code:

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());
})

erwartetes Ergebnis

Dezimalstellen = 18

Tatsächlicher Token-Saldo = 100000000.000000000000000000

Tatsächliche Ergebnis

Token-Guthaben = 100000000000

Ergebnis:

hast du es mit balance.div(1e18) oder balance.toNumber().div(1e18) versucht?
balance.div(1e18) gibt mir die Ziffern vor dem Dezimalpunkt. Ich brauche auch Nachkommastellen, um den genauen Kontostand anzuzeigen.

Antworten (5)

Wenn Ihr Token 18 Dezimalstellen hat

wie ein Äther, den Sie verwenden können

then(function(balance) {
    console.log(web3.fromWei(balance.toNumber(), "ether" ) );
})

Verwenden Sie fromWei , um Ihre bigNumber in Ether umzuwandeln und dann in Number umzuwandeln. Beachten Sie, dass unnötige 0 nach dem Fließkomma nicht angezeigt werden.

In web3 ^1.0 kann es sich zu web3.utils.fromWeistatt web3.fromWei doc ändern . Beachten Sie, dass truffle ^5.0 web3 ^1.0 verwendet.

Wenn Sie eine andere Token-Dezimalzahl haben

Sagen wir 6. Sie müssen die Konvertierung manuell mit etwas wie:

var tokenBalance = balance.ToNumber() / Math.pow(10, tokenDecimals)
Ich hatte ein Problem mit diesem Beispiel, wenn die Waage 18 Dezimalstellen hatte, wurde sie auf 16 zurückgezogen. Um dies zu beheben, habe ich verwendet web3.fromWei(balance.toString(), "ether"), beachten Sie .toString(). Ich bin mir nicht sicher, ob dies die beste Vorgehensweise ist.
Ja, die Verwendung von toString() hat auch für mich funktioniert, als ich toNumber() verwendet habe, hat es mir einen Fehler gegeben, weil wir diese große Zahl nicht in diesem Datentyp speichern können, denke ich.
ToNumber keine Funktion in truffle
@PhilipRego dies wurde vor 3 Jahren beantwortet. Es ist offensichtlich, dass es sich jetzt geändert hat.
Von Etherjs BigNumber.from(bn).div(BigNumber.from(10).pow(decimal)).toNumber()

Sie können die Exponentialzahlensyntax in Javascript verwenden, um Ihren Code zu verkürzen.

Beispiel (18 Dezimalstellen):

const balance = getBalance().toNumber() / 1E18

PS. Entschuldigung, ich kann wegen geringer Reputation keinen Kommentar abgeben.

Ich persönlich arbeite gerne mit großen Zahlen und zerlege sie nicht in "normale" Zahlen. Ich fürchte, ich fürchte, es könnte zu einem Überlauf kommen, wenn ich es nicht tue.

Wenn also ein Vertrag a zurückgibt uint, dann parse ich den Rückgabewert in a BigNumber(von bignumber.js ), wie folgt:

const balanceBefore = new BigNumber(await contract.getBalance(...));

und ich verwende die BigNumberAPI gerne für meine Behauptungen, etwa so:

assert(balanceBefore.minus(amountSent).minus(gasCost).isEqualTo(balanceAfter));
Wenn Sie -1, fügen Sie bitte auch einen Kommentar mit dem Grund hinzu, warum ... danke.

Ein schneller Weg könnte sein

import web3 from 'web3';

const ethProvider = new web3(web3.givenProvider).eth;
const accounts = await ethProvider.requestAccounts();
const ethBalance = web3.utils.fromWei(await ethProvider.getBalance(accounts[0]), 'ether');
console.log(ethBalance);

Ich glaube, Sie wollen nur das Guthaben protokollieren, das Sie verwenden sollten

    console.log(balance.toString());

stattdessen.

Es wird ein echter Fehler ausgegeben, dass die Zahl nicht in den js- numberTyp passen kann.