Safemath
使用 SafeMath 計算堅固度百分比
我希望這個問題沒有被問到,但我用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 語句),就不可能發生溢出/取消溢出。