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

Ant*_*ela 7 solidity

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

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

Pet*_*jda 5

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

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

function max(uint256 a, uint256 b) external pure returns (uint256) {
    return a >= b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

该函数具有线性复杂度。只读调用是免费的,但如果您max()由于交易而从另一个函数执行(这会花费汽油费),请注意复杂性。


Sea*_*ean 5

OpenZeppelin 提供了一个Math.max可以用于此目的的函数:

import "openzeppelin-contracts/utils/math/Math.sol";

uint256 max = Math.max(a, b);

Run Code Online (Sandbox Code Playgroud)

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