如何确定平方整数是否导致溢出。所有大于46340的数字的平方值都大于java的最大整数值。由于java将包围数字平方46431给出-2147479015而平方2147483647给出1,因此进一步复杂化。还不幸的是,我不能在Java 8中执行此操作,因为它会抛出ArithmeticException。那么有没有其他可能的方法来检查整数是否导致整数导致溢出?
答案 0 :(得分:5)
public class SecureSquare {
private static final double SECURE_SQUARE_LIMIT = Math.sqrt(Integer.MAX_VALUE);
public static int square(int number) {
if (Math.abs(number) > SECURE_SQUARE_LIMIT) {
throw new ArithmeticException("Square overflow exception!");
}
return number * number;
}
public static void main(String[] args) {
int number = square(-46340);
System.out.println(number);
}
}
43640的输出:
2147395600
43641的输出:
Exception in thread "main" java.lang.ArithmeticException: Square overflow exception!
at com.artofcode.test.SecureSquare.square(SecureSquare.java:9)
at com.artofcode.test.SecureSquare.main(SecureSquare.java:15)
...
答案 1 :(得分:2)
public boolean isSquareCauseOverflow(int n) {
if (n > 46340 || n < -46340) return true;
else return false;
}
答案 2 :(得分:1)
不完全了解您的用例,但您可以对方法的输入设置限制,该输入返回平方值。此限制可以是Intert.MAX的sqrt。
否则 - 您可以使用类似BigInteger
的内容来执行计算。
答案 3 :(得分:0)
同样不幸的是,我不能在Java 8中执行此操作,因为它会抛出ArithmeticException。
这是不正确的。整数溢出不会导致异常。只有整数除以零才会得到异常。这适用于所有现存版本的Java。
AFAIK,没有通用测试来查看原始整数算术运算 1 是否导致溢出。
对于任何特定情况,您可以根据数学分析或使用long
或BigInteger
执行等效操作序列来设计测试。
例如:
int number = ...
int square = number * number;
long longSquare = ((long) number) * ((long) number);
if (square != longSquare) {
System.out.println("Overflow occurred");
}
(我认为:上面涉及Integer.MIN_VALUE
可能存在边缘情况。如果您使用BigInteger
,则不应存在任何边缘情况。)
在这种情况下,查看是否导致溢出的测试是微不足道的,并且不需要更复杂的替代方案。
1 - 在Java 8中,一些新的&#34;确切的&#34;整数算术方法被添加到Math
类。如果发生溢出,这些抛出ArithmeticException
。但是,原始算术运算符的行为没有改变。