Eingabeargument im Remix eines Wertes sub 1

Wie kann man einen Wert wie 0,2 im Remix-Browser als Prozentsatz eingeben/formatieren?

z.Bfunction transfer(address _to, uint256 _value, uint256 percentage) public returns (bool);

(Kümmern Sie sich nicht um die Funktion, die zu Demonstrationszwecken dient)

Antworten (2)

uint256ist ein ganzzahliger Typ, daher können Sie nur ganze Zahlen übergeben. Solidity hat keine Fließkomma- oder Festkommazahlen.

Eine typische Problemumgehung besteht darin, eine rationale Zahl zu verwenden, dh Zähler und Nenner, oft mit festem Nenner. Wenn Sie beispielsweise einen Prozentsatz übergeben, übergeben Sie anstelle von 0,2 20 und dividieren durch 100:

amount * percentage / 100
Ziemlich cool, dass sie in Zukunft mit Unterstützung dafür experimentieren :) Festkommazahlen! Ich habe es auch mit Ihrem Vorschlag versucht, 20 zu übergeben und durch 100 zu dividieren, aber es wird auf 0 abgerundet, also denke ich, dass es vorerst nicht funktioniert :)
Ja, es funktioniert. Stellen Sie sicher, dass Sie vor dem Teilen multiplizieren. 5 / 100 * 20 == 0, aber 5 * 20 / 100 = 1. Wenn das nicht der Fall ist, teilen Sie bitte Ihren Code mit.
Die Sache ist, dass es keinen 'Betrag'-Teil der Berechnung gibt, ich möchte nur einen Prozentsatz zeigen, der zB 0,2 ist. Also, wenn Argument für _percentage Parameter = 20 und ich möchte, dass 0,2 als Prozentsatz angezeigt wird, versuche ich _percentage.div (100); was 0 ergibt. Ich habe es mit uint256(10).mul(_percentage).div(100) versucht; und setze _percentage diesmal auf 2 und es gibt immer noch 0.
Was meinst du mit "zeigen"? Das Anzeigen von etwas würde auf der Clientseite passieren, wo normalerweise Dezimalzahlen unterstützt werden. Für die Berechnung innerhalb des Smart Contracts müssen Sie den Wert 20 beibehalten, bis es an der Zeit ist, eine Berechnung damit durchzuführen.

Sie können so etwas tun:

pragma solidity ^0.4.20;

import "./SafeMath.sol";

contract Percentage{

    uint public testvalue;

    ///apply a percentage as modifying factor to the token amount to transfer
    constructor(uint256 _value, uint256 percentage) public {

        // reduce the amount to transfer by 20 Percent
       uint transferAmount = (_value * SafeMath.sub(100, percentage)) / 100;

       //set testresult
       testvalue = transferAmount;
    }   
}
Ich frage nicht, wie Prozentberechnungen im Code durchgeführt werden, ich frage, wie die Eingabe für das Remix-Eingabefeld formatiert wird, wenn ein Sub-1-Wert als Argument für einen Funktionsparameter eingefügt wird. zB für die Übertragungsfunktion angegeben "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", 5 aber für Sub 1 Werte wie 0,2 statt 5
Sie müssen es als Zeichenfolge einfügen und die Anzahl der führenden Nullen und die letzte(n) Zahl(en) analysieren.