在Solidity中是否有类似于Python的max(a,b)的函数,以找到几个给定值之间的最大值?



当然,这可以通过条件语句完成,但我想知道是否有更直接的方法。

如果没有任何明确的方法,实现它的最佳方法是什么?

在当前版本0.8中,没有从一组输入数字中获取最小/最大值的本机函数。

对于静态数量的值,您可以实现一个简单的条件(如果有2个以上的值,则可以实现一组条件(:

function max(uint256 a, uint256 b) external pure returns (uint256) {
return a >= b ? a : b;
}

对于动态数量的值,您可以简单地循环输入数组并跟踪最小/最大值:

function max(uint256[] memory numbers) external pure returns (uint256) {
require(numbers.length > 0); // throw an exception if the condition is not met
uint256 maxNumber; // default 0, the lowest value of `uint256`
for (uint256 i = 0; i < numbers.length; i++) {
if (numbers[i] > maxNumber) {
maxNumber = numbers[i];
}
}
return maxNumber;
}

此函数具有线性复杂性。只读调用是免费的,但请注意,如果由于事务(需要花费gas费用(而从另一个函数执行max(),则会很复杂。

OpenZeppelin提供了一个Math.max函数,您可以使用它:

import "openzeppelin-contracts/utils/math/Math.sol";
uint256 max = Math.max(a, b);

https://docs.openzeppelin.com/contracts/3.x/api/math#Math-max-uint256-uint256-

最新更新