Solidity

Solidity 中的除法/百分比(一種解決方法)

  • July 17, 2021

除法/百分比是許多應用程序的必需部分,但很難實現,因為fixedSolidityufixed尚不支持。我想出了這個解決方法:

 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),我正確地返回324代表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)

堅固。

引用自:https://ethereum.stackexchange.com/questions/52781