我在检测两个数字的和/乘以是否超过长整数的最大值时遇到问题.
示例代码:
long a = 2 * Long.MAX_VALUE;
System.out.println("long.max * smth > long.max... or is it? a=" + a);
Run Code Online (Sandbox Code Playgroud)
这给了我-2,而我希望它会抛出NumberFormatException......
是否有简单的方法使这项工作?因为我有一些代码在嵌套的IF块中进行乘法或在循环中添加,我不想在每个IF或循环内添加更多的IF.
编辑:哦,好吧,似乎从另一个问题的答案是最适合我需要的:https:
//stackoverflow.com/a/9057367/540394我不想做装箱/拆箱,因为它增加了不必要的开销,这种方式很短,这对我来说是一个巨大的优势.我将编写两个简短函数来执行这些检查并返回最小或最大长度.
Edit2:这是根据我上面链接的答案将长度限制为最小/最大值的功能:
/**
* @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) && (c >= 0)) ? Long.MIN_VALUE : c));
}
Run Code Online (Sandbox Code Playgroud)
如果您认为这是错误的,请告诉我.
如果您不确定结果是否会少于9万亿亿美元,我会使用double或BigInteger得到错误不会对您有太大帮助,因为您仍然需要知道该怎么做。
更好的方法是,首先验证输入以确保它们在范围内,并且如果结果的范围大于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
}
Run Code Online (Sandbox Code Playgroud)
双倍可以做到
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);
Run Code Online (Sandbox Code Playgroud)
注意:使用double而不是long会导致精度降低。
我宁愿首先避免需要一个错误块。
超过 long 的最大值不会引发异常,而是会返回。如果你这样做:
Long.MAX_VALUE + 1
你会注意到结果等价于 Long.MIN_VALUE
如果您希望它抛出异常,请检查它是否达到最大值并抛出异常
[编辑]
也可以使用Guava Library检查两个long相加时是否有溢出;
long c = LongMath.checkedAdd(a, b);
Run Code Online (Sandbox Code Playgroud)
这会在发生溢出时引发异常。
你可以在这里找到 javadoc
| 归档时间: |
|
| 查看次数: |
16269 次 |
| 最近记录: |