Solidity
Solidity 中的除法/百分比(一種解決方法)
除法/百分比是許多應用程序的必需部分,但很難實現,因為
fixed
Solidityufixed
尚不支持。我想出了這個解決方法:pragma solidity ^0.4.9; contract Math { function Math() public {} function percent(uint a, uint b) public constant returns(uint, uint) { uint c = a*b; uint integer = c/100; uint fractional = c%100; return (integer, fractional); } }
如果我想獲得 27 的 12% 並呼叫
percent(27, 12)
,我正確地返回3
並24
代表3.24
。對此的限制當然是percent(12.5, 100)
不可能的。但是,如果我打電話,
percent(17, 359)
我會回來。然而,真正的結果是,因為是 a ,所以 3 前面的 0 被刪除。有沒有辦法找出分數是否有前導零?61``3``61.03``fractional``uint
在我看來,這可能是對鏈上邏輯的不恰當使用,不僅因為隨之而來的程式碼笨拙,還因為呼叫者可以很容易地自己弄清楚的事情所涉及的 gas 成本。
話雖如此,可以使用以下方法處理小數位:Can’t do any integer division
此解釋返回正確四捨五入的整數百分比。例如,23.5% 返回 24。您可以通過修改整數轉換的方式來提高小數位精度。
pragma solidity 0.4.24; contract Percent { function getPercent(uint part, uint whole) public pure returns(uint percent) { uint numerator = part * 1000; require(numerator > part); // overflow. Should use SafeMath throughout if this was a real implementation. uint temp = numerator / whole + 5; // proper rounding up return temp / 10; } }
希望能幫助到你。
更新
做相反的事情,如下。此外,增加數量級以返回更高精度的結果。
在這裡,12 over 27 (12,27) 返回 324,客戶可以將其解釋為 32.4%。
function getFraction(uint percent, uint base) public pure returns(uint portion) { uint temp = percent * base * 10 + 5; return temp / 10; }
主要的收穫是使用整數。
+5
和的詭計/10
是確保正確的捨入。
正如 rob 提到的使用整數工作。我想出了其他辦法。在我的場景中,我必須將利率與基本金額一起儲存。要找到百分比並添加基礎量,公式如下
y = amount + (amount * percentValue / 100) y = (100 * amount) + (amount * percentValue) /100 y*100 = amount * (100 + percentValue)
這裡 y 基本上是預期的輸出。我沒有將值除以 100,因此該值將保持整數,在前端部分我將值除以,我只儲存
amount(100 + percentValue)
堅固。