我需要做一些输入验证,但遇到一个问题,我似乎没有找到答案(即使使用谷歌)。问题很简单:我在输入上有2个正整数,我需要检查它们的产品是否适合Java中的int类型。
我的一个尝试是将产品与Integer.MAX_VALUE进行比较,但看起来如果产品对于整数来说太大,则值变为负值。
我想通过改变标志来说产品太大了,但看起来如果产品“太大了”它会再次变为正面。
有人可以告诉我如何检测数字是否变得太大?
非常感谢提前!
答案 0 :(得分:3)
如果您正在使用UI,那么您可能并不特别着急。因此,您可以使用BigInteger,然后针对MAX_VALUE测试产品。
答案 1 :(得分:2)
将值转换为int
并查看值是否相同。一个简单的检查看起来像
double d =
long l =
BigInteger bi =
if (d == (int) d) // can be represented as an int.
if (l == (int) l) // can be represented as an int.
int i = bi.intValue();
if (bi.equals(BigInteger.valueOf(i)))
如果在退回时值相同,则不会丢失信息,您可以使用int
值。
答案 2 :(得分:1)
Java是关于溢出的骑士。没有编译时警告或运行时异常,以便在计算变得太大而无法存储在int或long中时通知您。浮动或双重溢出也没有警告。
/**
* multiplies the two parameters, throwing a MyOverflowException if the result is not an int.
* @param a multiplier
* @param b multiplicand
* @result product
*/
public static int multSafe(int a, int b) throws MyOverflowException
{
long result = (long)a * (long)b;
int desiredhibits = - ((int)( result >>> 31 ) & 1);
int actualhibits = (int)( result >>> 32 );
if ( desiredhibits == actualhibits )
{
return(int)result;
}
else
{
throw new MyOverflowException( a + " * " + b + " = " + result );
}
}
答案 3 :(得分:1)
您可以从输入值创建BigInteger并使用其intValue()方法进行转换。如果BigInteger太大而不适合int,则只返回低位32位。因此,您需要将结果值与输入值进行比较,以确保它不会被截断。