我在检测两个数的和/乘是否超过长整数的最大值时遇到问题。
示例代码: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
我不想做装箱/拆箱,因为它增加unnecassary开销,这种方式是非常总之,这对我来说是一个巨大的优势。我只写两个简短的函数来完成这些检查并返回最小或最大长度。
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));
}
告诉我,如果你认为这是错误的。
+1。应该有一些允许整数溢出检测的库。 – Thilo
或者特殊块(类似finally?),它可以帮助开发人员为所有在其中执行的数学代码启用溢出错误行为。我相信C#有一个。编辑:找到它,[在C#中选中和未选中的块](http://msdn.microsoft.com/zh-cn/library/a569z7k8.aspx)。 –
那么,C#似乎抛出溢出错误(我非常喜欢沉默和错误的结果,对我来说没有意义)... – jurchiks