Safemath

使用 SafeMath 計算堅固度百分比

  • November 22, 2021

我希望這個問題沒有被問到,但我用Google搜尋了太多,並試圖找出我自己的問題。

我正在嘗試使用 SafeMath 獲得動態百分比

uint256 lowNumber = 316442921;
uint256 highNumber = 632885842;
uint256 distanceFromHigherNumber = 544386085;

在日常數學中,我找到了一種計算方法,但在這裡行不通。

result = ((distanceFromHigherNumber - lowNumber) / (highNumber - lowNumber)) * 100;
percentage = 100 - result // in percentage should be ~ 28%

我是這樣做的:

uint256 result = (distanceFromHigherNumber.sub(lowNumber) / highNumber.sub(lowNumber)) * 100;
uint256 percentage = 100 - result;

它總是返回 100,我猜它可能返回 1 而不是 0.72,當我將它乘以 100 時,當我稍微玩一下它時,我只會得到零或 100。

請提供任何幫助,我對穩固性太陌生了。

Solidity 沒有浮點數的概念,因此您需要處理數字的整數表示。

你的想法很好,但運算順序不適用於整數。

result = ((x - low) / (high - low))

根據定義,將始終返回一個介於 0 和 1 之間的數字(除非您允許x < low,否則 x > high它沒有任何意義)。Solidity 只處理整數,所以它會返回 0 或 1,中間什麼都沒有。當您將此值乘以 100 時,您會得到 0 或 100…

您需要在進行除法之前進行乘法運算,以立即生成 0 到 100 之間的數字(或更多,具體取決於您要查找的精度)。

544386085當作為參數給出時,此程式碼返回您正在尋找的百分比: 72

pragma solidity ^0.7.0;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/math/SafeMath.sol";

   contract Percentage {
   
       using SafeMath for uint256;
       
       uint256 high = 632885842;  
       uint256 low =  316442921;
       uint256 precision = 2;
   
       function getPercentage(uint256 x) public view returns (uint256) {
           
           require(x >= low, "Number too low");
           require(x <= high, "Number too high");
           
           return x.sub(low).mul(10 ** precision) / high.sub(low);
       }
   }

順便說一句,SafeMath 在這裡是多餘的,因為如果您知道這一點x >= low並且x <= high (由於 require 語句),就不可能發生溢出/取消溢出。

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