将数字限制在下限和上限 bound/limit 之间的最佳方法
Best way to constrain a number between a lower and upper bound/limit
我有一个值不能低于一个设定值或高于另一个设定值。我已经写了一个方法来为我处理这个问题。我向您展示了这个相同方法的两个版本,它们的写法略有不同。一个有多个 if
语句,一个有一个 else if
树。两者return结果相同。 但是出于某种原因,一个比另一个更好吗? 或者(不是开玩笑)有第三种更好的方法吗?
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;
}
这些实际上是一样的。如果该值介于低值和高值之间,那么它将必须在两种方式上进行两次检查和 return 语句。如果该值高于高值,则两者都必须进行两次检查(首先是低检查),然后是 return 语句。如果该值低于低值,则两者都必须进行一次检查和一个 return 语句。
有更好的吗?性能貌似不是问题,那么问题就变成了哪个更易读和可维护?如果您使用 ReSharper,它会将第一个标记为具有不必要的 else
s。如果您不使用 ReSharper,那么应该归结为您和您的团队认为最容易理解的工具。
我原本打算建议使用 max(min(input,high),low)。我决定不这样做,因为 它更难理解 (imo)。
好吧,也许不是开玩笑。这是我的做法
function constrain (low, value, high) {
return (value<low? low:
value>high? high:
value);
}
I have a value that cannot go below a set value or above another set value.
所以这意味着程序员在使用此值时调用 Constrain
是他们的责任 - 这听起来像是一个很容易犯的简单错误。
如果你有它的范围,你可以接近这是一种更面向对象的方式,并创建一个 class 来限制双精度值。这样你就可以随心所欲地使用它,而且它永远不会超过限制。
不是你问题的真正答案,但由于我们在此处进行了很好的回答,我会将此版本添加为更通用的代码片段:
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;
}
我有一个值不能低于一个设定值或高于另一个设定值。我已经写了一个方法来为我处理这个问题。我向您展示了这个相同方法的两个版本,它们的写法略有不同。一个有多个 if
语句,一个有一个 else if
树。两者return结果相同。 但是出于某种原因,一个比另一个更好吗? 或者(不是开玩笑)有第三种更好的方法吗?
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;
}
这些实际上是一样的。如果该值介于低值和高值之间,那么它将必须在两种方式上进行两次检查和 return 语句。如果该值高于高值,则两者都必须进行两次检查(首先是低检查),然后是 return 语句。如果该值低于低值,则两者都必须进行一次检查和一个 return 语句。
有更好的吗?性能貌似不是问题,那么问题就变成了哪个更易读和可维护?如果您使用 ReSharper,它会将第一个标记为具有不必要的 else
s。如果您不使用 ReSharper,那么应该归结为您和您的团队认为最容易理解的工具。
我原本打算建议使用 max(min(input,high),low)。我决定不这样做,因为 它更难理解 (imo)。
好吧,也许不是开玩笑。这是我的做法
function constrain (low, value, high) {
return (value<low? low:
value>high? high:
value);
}
I have a value that cannot go below a set value or above another set value.
所以这意味着程序员在使用此值时调用 Constrain
是他们的责任 - 这听起来像是一个很容易犯的简单错误。
如果你有它的范围,你可以接近这是一种更面向对象的方式,并创建一个 class 来限制双精度值。这样你就可以随心所欲地使用它,而且它永远不会超过限制。
不是你问题的真正答案,但由于我们在此处进行了很好的回答,我会将此版本添加为更通用的代码片段:
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;
}