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

hrysbysz  于 2023-09-29  发布在  Java
关注(0)|答案(8)|浏览(120)

我想返回的数字,只要它福尔斯在一个限制,否则返回的最大值或最小值的限制。我可以用Math.minMath.max的组合来实现这一点。

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

我想知道是否有一个我忽略的现有limitrange函数。
如果第三方库很常见,欢迎使用(例如:Commons或Guava)

dz6r00yl

dz6r00yl1#

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

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

qpgpyjmq

qpgpyjmq2#

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

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

xesrikrc

xesrikrc3#

从版本21开始,Guava包括Ints.constrainToRange()(以及其他原语的等效方法)。来自发行说明:
添加了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。我也很震惊,无论是下议院朗和下议院数学有它!:(

u0sqgete

u0sqgete4#

如果你在Android上,使用MathUtils(在支持库中),它只有一个专门做这个的函数,叫做clamp。
该方法采用数值并确保其适合给定的数值范围。如果数字小于范围所需的最小值,则返回范围的最小值。如果数字大于范围允许的最大值,则返回范围的最大值。

amrnrhlw

amrnrhlw5#

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

piwo6bdm6#

任何实现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;
}

唯一的要求是所有参数必须属于同一类。它可以防止可能的类型转换丢失。事实上,将floatdoublelongint等进行比较是不正确的。例如(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)直接改变第一个参数是不可能的,因为基本类型是不可变的。

wmtdaxz3

wmtdaxz37#

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

int valueToClamp = 0;

System.out.println(Math.clamp(valueToClamp, 1, 10)); // 1

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

  • value-箝位值
  • min-允许的最小值
  • max-最大允许值
vh0rcniy

vh0rcniy8#

你不需要一个外部的库,试试这个测试用例:

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

}

相关问题