java数量超过long.max_value – 如何检测?

我在检测两个数字的和/乘以是否超过长整数的最大值时遇到问题。
示例代码:

long a = 2 * Long.MAX_VALUE; System.out.println("long.max * smth > long.max... or is it? a=" + a); 

这给了我-2 ,而我希望它抛出一个NumberFormatException

有没有简单的方法使这项工作? 因为我有一些代码在嵌套的IF块中进行乘法或在循环中添加,我不想在每个IF或循环内添加更多的IF。

编辑:哦,好吧,似乎从另一个问题的答案是最适合我需要的: https : //stackoverflow.com/a/9057367/540394
我不想做装箱/拆箱,因为它增加了不必要的开销,这种方式非常短,这对我来说是一个巨大的优势。 我将编写两个简短函数来执行这些检查并返回最小或最大长度。

Edit2:这是根据我上面链接的答案将长度限制为最小/最大值的function:

 /** * @param a : one of the two numbers added/multiplied * @param b : the other of the two numbers * @param c : the result of the addition/multiplication * @return the minimum or maximum value of a long integer if addition/multiplication of a and b is less than Long.MIN_VALUE or more than Long.MAX_VALUE */ public static long limitLong(long a, long b, long c) { return (((a > 0) && (b > 0) && (c <= 0)) ? Long.MAX_VALUE : (((a < 0) && (b = 0)) ? Long.MIN_VALUE : c)); } 

如果您认为这是错误的,请告诉我。

如果您不能确定结果将少于9万亿亿,我会使用doubleBigInteger获取错误对您没有多大帮助,因为您仍然需要知道该怎么做。

更好的是,通过validation输入以确保它们在范围内并且如果结果的范围大于long使用可以处理此类型的类型,首先不会出现错误。

有了BigInteger你就可以做到

 BigInteger a = BigInteger.valueOf(2).multiply(BigInteger.valueOf(Long.MAX_VALUE)); long l = a.longValue(); if (a.compareTo(BigInteger.valueOf(l)) == 0) { // ok } else { // error } 

有了双倍,你可以做到

 double d = 2.0 * Long.MAX_VALUE; long l = (long) Math.max(Long.MIN_VALUE, Math.min(Long.MAX_VALUE, d)); // or as a helper method. long l = boundedCast(d); 

注意:使用double而不是long可能会导致精度损失。

我宁愿首先避免使用错误块。

超过一个long的最大值不会引发exception,而是反过来。 如果你这样做:

Long.MAX_VALUE + 1

你会注意到结果相当于Long.MIN_VALUE。

如果您希望它抛出exception检查它是否达到最大值并抛出exception

[编辑]

您还可以使用番石榴库来检查两个长度相加时是否存在溢出;

 long c = LongMath.checkedAdd(a, b); 

当在求和两个long时发生溢出时抛出exception。

你可以在这里找到javadoc

超过MAX_VALUE Long值不会引发任何exception。 您需要手动检查并处理此类情况。

虽然@PeterLawrey建议你应该考虑使用doubleBigInteger