以太坊 Solidity 的划分

Posted

技术标签:

【中文标题】以太坊 Solidity 的划分【英文标题】:Division in Ethereum Solidity 【发布时间】:2017-08-01 23:51:12 【问题描述】:

我正在创建一个发行代币的合约。我想要一个持有代币的账户,以便能够检查他们在所有已发行代币中拥有的百分比。我知道以太坊还没有实现浮点数。我该怎么办?

【问题讨论】:

【参考方案1】:

在客户端而不是在 Solidity 中执行该计算可能是最好的(最低 gas 成本且易于实施)。

如果您发现在 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%。

希望对您有所帮助。

【讨论】:

这将是计算合约能够为给定代币持有者支付多少费用所必需的。例如,如果一个代币持有者拥有 20 个代币并且总共有 100 个代币。合约需要能够决定 20 个代币价值合约中总以太币的 20%。例如,总醚可以是5 eth。我可以分卫吗?这将如何运作? 很公平,不。魏是最小的单位,所以你必须决定如何处理余数。如果您要获得全精度,则使用更高精度的用户余额作为状态变量来跟踪小数 Wei……当累积余额足够大时偶尔结算。请记住,实际移动一个单位的 Wei 会消耗气体,因此请考虑移动少量的效率。 好吧,如果你通过 20,100,3 那么你得到 200 - 我们称之为“部分”),意思是千分之 200,或 20.0%。因此,您可以根据需要获得尽可能多的精度。然后,您可以说 amountToDivide * part / 1000。1,000 是 3(原始精度)**10。我更正了函数中的疏忽,使其正确四舍五入。顺便说一句,“转换为十进制”是我在金融界听到的简写……意思是乘以 100。没什么特别的。此外,关于“安全”的评论是为了以防您正在处理可能溢出并做讨厌事情的大量数字。 溢出。如果数字对于 uint256 来说太大,它不会抛出......它只会抛出高位并返回一个小数字。为什么你会看到像 if(a+b @user5811892 Prolly 值得一票,如果您觉得有帮助,请接受。 ;-)

以上是关于以太坊 Solidity 的划分的主要内容,如果未能解决你的问题,请参考以下文章

以太坊Solidity合约升级策略

solidity开发以太坊代币智能合约

Solidity智能合约开发 — 1-以太坊开发工具和部署

以太坊 solidity 教程

以太坊/Solidity 新手:方便地发送多笔交易

基于以太坊的智能合约solidity学习日记