Java - 限制最小值和最大值之间的数字

Sea*_*lly 42 java math range max min

我希望返回该数字,只要它在一个限制内,否则返回限制的最大值或最小值.我可以用Math.min和组合来做到这一点Math.max.

public int limit(int value) {
    return Math.max(0, Math.min(value, 10));
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否存在我正在忽视的现有limitrange功能.
如果第三方图书馆很常见,欢迎加入(例如:Commons或Guava)

Bar*_*aes 23

OP在标准库中请求此实现:

int ensureRange(int value, int min, int max) {
   return Math.min(Math.max(value, min), max);
}

boolean inRange(int value, int min, int max) {
   return (value>= min) && (value<= max);
}
Run Code Online (Sandbox Code Playgroud)

可惜标准的数学库缺乏这些

  • 此外,基于 C 的语言缺乏明显的习语 `(min &lt;= value &lt;= max)`,这让新手感到非常震惊。 (2认同)
  • 我认为ensureRange应该是另一种方式:`int ensureRange(int value,int min,int max){return Math.min(Math.max(value,min),max); 这是将它放入库中的一个很好的理由.所以你只能错一次;-) (2认同)

Hen*_*wan 9

从版本21开始,Guava包含Ints.constrainToRange()(以及其他基元的等效方法).从发行说明:

添加constrainToRange([type] value, [type] min, [type] max)了将给定值约束到由minmax值定义的闭合范围的方法.如果它在范围内,它们返回值本身,如果它在范围min之下,max如果它在范围之上,则返回值.

复制自@ dimo414的/sf/answers/3007777811/.

不幸的是,这个版本是截至2017年7月的最新版本,并且在一些项目中(参见/sf/answers/2848428201/),Guava破坏了向后兼容性,这要求我现在停留在第19版.我也很震惊,Commons Lang和Commons Math都没有!:(


HBB*_*B20 9

我知道这是针对 Java 要求的。在 Android 世界中,将 Kotlin 和 Java 结合使用是很常见的。如果一些 Kotlin 用户到达这里(就像我一样),那么他们可以使用coerceIn扩展功能:

科特林代码:

println(10.coerceIn(1, 100)) // 10
println(10.coerceIn(1..100)) // 10
println(0.coerceIn(1, 100)) // 1
println(500.coerceIn(1, 100)) // 100
Run Code Online (Sandbox Code Playgroud)

Kotlin官方文档中阅读更多内容。


RJF*_*res 7

如果您使用的是Android,请使用MathUtils(在支持库中),它只有一个专门执行此功能的函数,称为钳位。

此方法采用一个数值,并确保它适合给定的数值范围。如果数字小于范围所需的最小值,则将返回范围的最小值。如果数字大于范围允许的最大值,则将返回范围的最大值。

  • 伟大的。只是为了记录,使用示例:`MathUtils.clamp( value, min, max )` (2认同)

Maj*_*ssi 5

Math.max(int a, int b)函数定义为:

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以将maxmin功能组合如下:

private static int MAX=10;
private static int MIN=0;

public int limit(int a) {
    return (a > MAX) ? MAX : (a < MIN ? MIN: a );
}
Run Code Online (Sandbox Code Playgroud)


Ole*_*hov 2

Java 21 中添加了新Math.clamp方法(具有多个重载),可以方便地将数值限制在指定的最小值和最大值之间:

int valueToClamp = 0;

System.out.println(Math.clamp(valueToClamp, 1, 10)); // 1
Run Code Online (Sandbox Code Playgroud)

public static int clamp(long value, int min, int max)

  • value- 钳位值
  • min- 最小允许值
  • max- 最大允许值