Math

為什麼 DS-Math 在 WAD,RAY 乘法函式中添加 WAD/2 或 RAY/2

  • December 30, 2021
//rounds to zero if x*y < WAD / 2
function wmul(uint x, uint y) internal pure returns (uint z) {
   z = add(mul(x, y), WAD / 2) / WAD;
}
//rounds to zero if x*y < WAD / 2
function rmul(uint x, uint y) internal pure returns (uint z) {
   z = add(mul(x, y), RAY / 2) / RAY;
}

我認為它會添加工件小數字前。2WAD x 1WAD = 2WAD + 0.5 是出於安全原因嗎?

是什麼

//如果 x*y < WAD / 2,則舍入為零

我想不通。

DS-數學

x * y &lt; WAD / 2==>

x * y + WAD / 2 &lt; WAD==>

(x * y + WAD / 2) / WAD == 0

因此,無論是否添加,四捨五入為零的評論都是正確的,WAD / 2因為solidity 總是四捨五入為零。做的情況+ WAD / 2是當定點小數的十分位大於 5 時將值向上舍入。

查看一些以小數表示的範例(在 Solidity 中,這是 WAD 精度):

如果x * y = 1.2那麼x * y + 0.5 = 1.7。這兩個都在 Solidity 中舍入到 1

如果x * y = 1.7那麼x * y + 0.5 = 2.2。第一個方程將向下舍入為 1,第二個方程將向下舍入為 2。

這是添加的效果WAD / 2

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