以太坊的分工

GK1*_*GK1 8 ethereum solidity

我正在创建一个签发合同的合同.我想要一个持有令牌的帐户,以便能够检查他们拥有的所有令牌的百分比.我知道以太坊还没有实现浮点数.我该怎么办?

Rob*_*lab 13

在客户端执行计算而不是在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);
  }

}
Run Code Online (Sandbox Code Playgroud)

如果你喂它101,450,3你得到224,即22.4%.

希望能帮助到你.

  • 溢出.如果数字对于uint256而言太大,它就不会抛出...它只会抛出高位并返回一个小数字.为什么你看到如if(a + b <a)throw的例子; 在文档中.需要认为通过这种情况.像if(分子*10*(精度+ 1)<分子)抛出的东西; ......在我说我确定那张支票之前,我会再考虑一下.希望传达这个想法. (2认同)