我想返回一个不超过我设定限制的数字。例如,我想做相当于:
if (number >= limit)
number = limit;
return number;
是否有一种数学方法可以完全相同于我刚才描述的一行?
答案 0 :(得分:6)
你可以:
return Math.min(number, limit);
或:
return number >= limit ? limit : number;
答案 1 :(得分:2)
还有以下数学公式:(取自here)
min(a,b) = 1/2 (a + b - |a - b|)
代码:
return ( number + limit - Math.abs(number - limit) ) / 2;
现在Math.abs
看起来与Math.min
非常相似(因此,使用上述代替Math.min
)并不是很重要,尽管您可以轻松地将其替换为mask = n >> 31 // 11111111 for negative and 00000000 for positive
abs = (mask + n)^mask // convert negative to positive in 2's complement
// while not changing positive
提交的方法为here或here:
number + limit
注意:
如果number - Math.abs(...) + limit
可能会溢出,则无法正常工作。这可以改为
number - Math.abs(...)
要避免这种情况,但是float
仍然可以下溢 - 您只需要记住溢出并选择可以防止基于数字范围的上溢/下溢的选项,或者选择非算术选项。
另请注意,假设没有上溢/下溢,如果您正在处理浮点值(double
/ {{1}})而不是整数类型,则上述结果将赢得& #39; t必须返回任一值(因为浮点表示的工作方式)。