使用数学施加数值限制

时间:2014-04-01 12:20:27

标签: java algorithm

我想返回一个不超过我设定限制的数字。例如,我想做相当于:

if (number >= limit)
    number = limit;
return number;

是否有一种数学方法可以完全相同于我刚才描述的一行?

2 个答案:

答案 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 提交的方法为herehere

number + limit

注意:

如果number - Math.abs(...) + limit可能会溢出,则无法正常工作。这可以改为
number - Math.abs(...)要避免这种情况,但是float仍然可以下溢 - 您只需要记住溢出并选择可以防止基于数字范围的上溢/下溢的选项,或者选择非算术选项。

另请注意,假设没有上溢/下溢,如果您正在处理浮点值(double / {{1}})而不是整数类型,则上述结果将赢得& #39; t必须返回任一值(因为浮点表示的工作方式)。