在下限和上限/限制之间约束数字的最佳方法

本文关键字:数字 约束 最佳 方法 之间 | 更新日期: 2023-09-27 18:30:19

>我有一个值不能低于设定值或高于另一个设定值的值。我已经编写了一个为我处理这个问题的方法。我向您展示了相同方法的两个版本,写得略有不同。一个具有多个if语句,另一个具有else if树。两者都返回相同的结果。但是由于某种原因,一个比另一个更好吗?或者(不开玩笑)有第三种更好的方法吗?

double Constrain(double low, double value, double high)
{
    if (value < low)
        return low;
    else if (value > high)
        return high;
    else
        return value;
}
double Constrain(double low, double value, double high)
{
    if (value < low)
        return low;
    if (value > high)
        return high;
    return value;
}

在下限和上限/限制之间约束数字的最佳方法

一个更好吗? 性能似乎不是问题,那么问题就变成了哪个更具可读性和可维护性? 如果您使用 ReSharper,它会将第一个标记为具有不必要的else。 如果你不使用ReSharper,它应该归结为你和你的团队认为哪一个最容易理解。

我最初建议使用max(min(input,high),low)。 我决定不这样做,因为它更难理解(imo)。

不是你问题的答案,但由于我们在答案中有很好的对话,我会将此版本添加为更通用的代码片段:

public static T Constrain <T>(this T val, T low, T high) where T : IComparable<T>
{
    if (val.CompareTo(low) < 0) return low;
    if (val.CompareTo(high) > 0) return high;
    return val;
}

这些实际上是相同的。如果该值介于低值和高值之间,则必须以两种方式执行两次检查和 return 语句。如果该值高于高值,则两者都必须执行两次检查(首先是低检查),然后是 return 语句。如果该值低于低值,则两者都必须执行一次检查和返回语句。

好吧,也许不是好笑的。 这是我会怎么做的

function constrain (low, value, high) {
    return (value<low? low:
            value>high? high:
            value);
}

我有一个值不能低于设定值或高于另一个设定值。

因此,这意味着程序员在使用此值时调用Constrain - 这听起来像是一个简单的错误,很容易犯。

如果你有它的作用域,你可以用这种方法更面向对象,并创建一个类来夹住双精度值。这样您就可以随心所欲地使用它,并且它永远不会超过限制。