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

时间:2013-07-29 20:23:34

标签: java math range max min

我想返回该数字,只要它在一个限制内,否则返回限制的最大值或最小值。我可以使用Math.minMath.max的组合来完成此操作。

public int limit(int value) {
    return Math.max(0, Math.min(value, 10));
}

我想知道我是否会忽略现有的limitrange功能。
如果第三方图书馆非常普遍(例如:Commons或Guava),欢迎第三方图书馆

8 个答案:

答案 0 :(得分:24)

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);
}

可惜标准数学库缺少这些

答案 1 :(得分:8)

从版本21开始,Guava包含Ints.constrainToRange()(以及其他基元的等效方法)。来自release notes

  

添加constrainToRange([type] value, [type] min, [type] max)方法,将给定值约束到minmax值定义的封闭范围。如果值在范围内,则返回值本身;如果值低于范围,则返回min;如果值超出范围,则返回max

由@ dimo414从https://stackoverflow.com/a/42968254/122441复制。

不幸的是,这个版本是截至2017年7月的最新版本,并且在某些项目中(参见https://stackoverflow.com/a/40691831/122441)Guava破坏了向后兼容性,这要求我现在保持第19版。我也很震惊,Commons Lang和Commons Math都没有! :(

答案 2 :(得分:4)

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

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}

因此,您可以将maxmin函数组合如下:

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

public int limit(int a) {
    return (a > MAX) ? MAX : (a < MIN ? MIN: a );
}

答案 3 :(得分:4)

如果您使用Android,请使用MathUtils(在支持库中),它只有一个功能,专门执行此操作称为clamp。

  

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

答案 4 :(得分:3)

任何实现Comparable的类的通用方法(包括Number及其子类):

public static <T extends Comparable<? super T>> T limit(T o, T min, T max){
    if (o.compareTo(min) < 0) return min;
    if (o.compareTo(max) > 0) return max;
    return o;
}

唯一要求是所有参数必须属于同一类。它可以防止可能的类型转换损失  事实上,将floatdouble longint等进行比较是不正确的。例如(double) 0.1 != (float) 0.1

<强>用法:

double x = 13.000000001;
x = limit(x, 12.0, 13.0);
System.out.println("x = " + x); //x = 13.0

不幸的是,直接用limit(x, 12.0, 13.0)直接改变第一个参数是不可能的,因为原始类型是不可变的。

答案 5 :(得分:0)

我知道有人要求使用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

详细了解官方Kotlin Documentation

答案 6 :(得分:-1)

这是使用kotlin制成的,希望对您有所帮助!

 var ConstrainedValue = if(CurrentSafeValue < 1) 1 else (if(CurrentSafeValue > 18)18 else CurrentSafeValue);

答案 7 :(得分:-3)

您不需要外部库,请尝试此测试用例:

public class RandomNumber {
public static void main(String[] Args) {
    System.out.println("random = " + randomInRange(5,10));
}

public static double randomInRange(double arg1, double arg2) {
    double my_number = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
    return my_number;
 }

}