我正在创建一份发行代币的合约。我希望持有代币的账户能够查询他们所拥有的代币与所有已发行代币的百分比。我知道以太坊尚未实现浮点数。我该怎么办?
最好(燃气成本低且易于实现)在客户端执行该计算,而不是在Solidity中执行。如果您发现需要在Solidity中执行该操作,那么只需要通过移动小数点来使用整数进行计算,类似于:https://en.wikipedia.org/wiki/Parts-per_notation
例如,此函数使您可以决定精度级别,并使用一个额外的精度级别以正确四舍五入:
pragma solidity ^0.4.6;
contract Divide {
function percent(uint numerator, uint denominator, uint precision) public
constant returns(uint quotient) {
// caution, check safe-to-multiply here
uint _numerator = numerator * 10 ** (precision+1);
// with rounding of last digit
uint _quotient = ((_numerator / denominator) + 5) / 10;
return ( _quotient);
}
}
如果你输入101,450和3,你将得到224,即22.4%。
希望这能帮助到您。
11010.1 in base2 = 1 * 24 + 1 * 23 + 0 * 22 + 1 * 21 + 0* 20 + 1 * 2-1 = 26.5
百分比是通过计算得出的
// x is the percentage
a/b = x/100 => x= (100*a)/b
如果要计算大数的除法,您可以使用FixidityLib.sol库。
function divide(Fixidity storage fixidity, int256 a, int256 b) public view returns (int256) {
if(b == fixidity.fixed_1) return a;
assert(b != 0);
return multiply(fixidity, a, reciprocal(fixidity, b));
}
有太多数学库或合约,每个实现除法操作的方式都不同:
DSMath 合约