此代码应返回两个数字中较小的一个,返回一个类似于较大数字的负数:
Math.min(15, 21474836477) --> returns -2147483642
我怀疑这与int's
的范围有关,所以我将值更改为long
,程序运行正常。
我不太明白它返回的看似随机的数字 - 为什么它是-2147483643
而不是我输入的实际数字-21474836477
?它的溢出量是否会产生差异,或者它是否会以某种方式受到Math.min的其他参数的影响?
答案 0 :(得分:2)
声明的结果-2147483642是5-Integer.MAX_VALUE,也是7 + Integer.MAX_VALUE。我怀疑Math.min参数实际上是该值,可能是由于对其中一个表达式的评估所致。非常消极,绝对不到15岁。
这个程序:
public class Test {
public static void main(String[] args) {
System.out.println(Math.min(15, Integer.MAX_VALUE));
System.out.println(Math.min(15, 7+Integer.MAX_VALUE));
System.out.println(Math.min(15, 5-Integer.MAX_VALUE));
}
}
输出:
15
-2147483642
-2147483642
答案 1 :(得分:0)
这个
Math.min(15, 21474836477)
无法返回
-2147483642
代码本身不会编译,因为整数文字21474836477
在int
value range之外。
你可能会跑
Math.min(15L, 21474836477L)
在这种情况下,您将运行重载的Math.min(long, long)
方法。
答案 2 :(得分:0)
Math.min重载,如下所示。
静态双分(双a,双b) 返回两个double值中较小的一个。 static float min(float a,float b) 返回两个浮点值中较小的一个。 static int min(int a,int b) 返回两个int值中较小的一个。 静态长min(长a,长b) 返回两个long值中较小的一个。
因此您甚至可以将它用于长值,例如
long x = 98759765l;
long y = 15428764l;
// print the smaller number between x and y
System.out.println("Math.min(" + x + "," + y + ")=" + Math.min(x, y));
但是,你的长距离也超出了范围