Math
為什麼 DS-Math 在 WAD,RAY 乘法函式中添加 WAD/2 或 RAY/2
//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,則舍入為零
我想不通。
x * y < WAD / 2
==>
x * y + WAD / 2 < 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
。