Solidity

如何將固定十進制 var 乘以 uint ?

  • January 30, 2022

在這個例子的基礎上: 處理乘法分數

我正在正確添加 th DSMath。我可以使用整數進行操作和編譯,但是如果我嘗試在函式 Remix 中編譯帶有任何小數的合約,請不要讓我編譯:(例如)這個函式

function theCalc(uint aNumber) public view returns(uint){
   return wmul(aNumber, 3.1416);
}

重新混合錯誤:TypeError:函式呼叫中的參數類型無效。請求的從rational_const 3927 / 1250 到 uint256 的隱式轉換無效。返回 wmul(aNumber,3.1416);

知道如何在我的可靠性計算中使用固定的十進制數嗎? 謝謝你。

錯誤消息表明計算按原樣工作。您的實際問題是“theCalc”是以期望返回整數的方式聲明的(“returns(uint)”)。

處理小數的經典方法包括放大和縮小。這不一定涉及DS_Math圖書館,我們會嘗試回到那個。

放大和縮小

雖然 Solidity 確實沒有十進制值,但您可以通過將某個值乘以某個常數來放大一個值,然後乘以您的十進制值作為一個整數(31416在 OP 的範例中 pi 將變為),然後通過除以縮小在開始時乘以相同的常數。1e18似乎是一個共同的常數(至少如果您使用的是適當大的uint,例如uint256)。這看起來像:

function multiplyByPi(uint256 num) public view returns(uint256) {
   uint256 scaledSolution = num.mul(1e18).mul(31416);
   return scaledSolution / 1e18
}

DS-數學

DS-Math是來自DappHub的一個庫,它提供溢出安全操作,以及他們描述為定點十進制數的表示。經過檢查,該句子的第二部分並不意味著您可以輸入類似的內容3.1416並讓編譯器理解。在引擎蓋下,DS-Math 看起來和我們上面討論的一樣——如果你使用 Wads,它會縮放 18 個位置,如果你使用 Rays,它會縮放 27 個位置。所以如果你想使用 wad 數學(如在您的問題中使用wmul),您可以執行以下操作:

function theCalc(uint256 aNumber) public view returns(uint256){
       uint256 pi = 3141592653589793284;
       return wmul(aNumber, pi);
}

這可能無法滿足您的所有需求。如果您將輸入1到上面的函式中,它將輸出3,因為 Solidity,即使使用 DS-Math,也沒有小數。它希望您將前 18 位作為小數空間進行跟踪,至少據我所知。在該範例中,將 1e18(作為帶有 18 個零的 1,您可能無法實際輸入1e18)作為參數將類似於輸入 1,並且該函式將返回3.14...18 個小數位。

簡而言之,雖然這可能不是您要尋找的答案,但截至撰寫本文時(2021 年 3 月),DS-Math 不允許您編寫小數3.14並將其用於數學運算。它確實允許您使用 wads 升級到 18 個位置,使用光線升級到 27 個位置,但所有這些都可以升級 1e18 或 1e27。

希望這可以幫助!

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