gpt4 book ai didi

java number exceeds long.max_value - 如何检测?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:10:29 24 4
gpt4 key购买 nike

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

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

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

是否有一种简单的方法来完成这项工作?因为我有一些代码在嵌套的 IF block 中执行乘法或在循环中执行加法,所以我不希望向每个 IF 或循环内添加更多 IF。

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

Edit2:根据我在上面链接的答案,这里是将 long 限制为其最小/最大值的函数:

/**
* @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));
}

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

最佳答案

如果你不能确定结果会小于 9 万亿万亿,我会使用 doubleBigInteger 得到错误对你帮助不大因为您仍然需要知道该怎么做。

最好不要首先通过验证输入来确保它们在范围内而出现错误,如果结果的范围大于 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你可以做到

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 会导致一些精度损失。

我宁愿一开始就避免使用错误 block 。

关于java number exceeds long.max_value - 如何检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12348067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com