Java 如何以高效的方式检查乘法溢出?

Java 如何以高效的方式检查乘法溢出?,java,math,overflow,Java,Math,Overflow,假设我有: int result = value1 * value2; boolean isOverflow = ? 如何以一种高效的方式检查溢出?我找到了。我也注意到了,但没有可用的答案 更新:无法保证值是正值还是负值。您可以使用com.google.common.math包中LongMath类中提供的checkedMultiply。 有关信息,请查看 或 Math类中的Java8 multiplyExact方法。对于java文档,请单击 或 您可以通过以下方式检查溢出- long over

假设我有:

int result = value1 * value2;
boolean isOverflow = ?
如何以一种高效的方式检查溢出?我找到了。我也注意到了,但没有可用的答案

更新:无法保证值是正值还是负值。

您可以使用com.google.common.math包中LongMath类中提供的checkedMultiply。 有关信息,请查看

Math类中的Java8 multiplyExact方法。对于java文档,请单击

您可以通过以下方式检查溢出-

long overflowCheck;
if(Math.sign(value1) == Math.sign(value2)) {
   overflowCheck = Long.MAX_VALUE 
} else {
  overflowCheck = Long.MIN_VALUE;
}

if (value1 != 0 && (value2 > 0 && value2 > overflowCheck / value1 ||
    value2 < 0 && value2 < overflowCheck / value1))
{
   isOverflow = true; 
}
您可以使用com.google.common.math包中LongMath类中提供的checkedMultiply。 有关信息,请查看

Math类中的Java8 multiplyExact方法。对于java文档,请单击

您可以通过以下方式检查溢出-

long overflowCheck;
if(Math.sign(value1) == Math.sign(value2)) {
   overflowCheck = Long.MAX_VALUE 
} else {
  overflowCheck = Long.MIN_VALUE;
}

if (value1 != 0 && (value2 > 0 && value2 > overflowCheck / value1 ||
    value2 < 0 && value2 < overflowCheck / value1))
{
   isOverflow = true; 
}

好消息是,在新的JDK 8中,在Math类中会有一些方法来执行抛出溢出异常的操作

例如,当溢出发生时,新方法抛出一个算术异常。如果您使用的是以前版本的Java,那么可能一个很好的方法就是复制这个精确的实现,这样以后,当您升级到JDK 8时,您所要做的就是为该方法使用新的JDK实现

JDK 8中的当前实现如下所示:

/**
  * Returns the product of the arguments,
  * throwing an exception if the result overflows an {@code int}.
  *
  * @param x the first value
  * @param y the second value
  * @return the result
  * @throws ArithmeticException if the result overflows an int
  * @since 1.8
  */
public static int multiplyExact(int x, int y) {
    long r = (long)x * (long)y;
    if ((int)r != r) {
       throw new ArithmeticException("long overflow");
    }
    return (int)r;
 }

好消息是,在新的JDK 8中,在Math类中会有一些方法来执行抛出溢出异常的操作

例如,当溢出发生时,新方法抛出一个算术异常。如果您使用的是以前版本的Java,那么可能一个很好的方法就是复制这个精确的实现,这样以后,当您升级到JDK 8时,您所要做的就是为该方法使用新的JDK实现

JDK 8中的当前实现如下所示:

/**
  * Returns the product of the arguments,
  * throwing an exception if the result overflows an {@code int}.
  *
  * @param x the first value
  * @param y the second value
  * @return the result
  * @throws ArithmeticException if the result overflows an int
  * @since 1.8
  */
public static int multiplyExact(int x, int y) {
    long r = (long)x * (long)y;
    if ((int)r != r) {
       throw new ArithmeticException("long overflow");
    }
    return (int)r;
 }

如果value1和value2为正,并且结果小于value1或value2,我认为这将是一个很好的指标。无法保证正或负改变您想做的事情的性质,我认为您找到的解决方案毕竟没有那么昂贵,如果您担心性能,可能更好的解决方案是在执行乘法运算之前验证操作数的范围。signvalue1*Math.signvalue2!=Math.signresult应该可以做到这一点,但我不是100%确定。如果value1和value2为正,并且结果小于value1或value2,我会说这是一个很好的指标。不能保证正或负改变你想做的事情的性质,我认为你找到的解决方案毕竟没有那么昂贵,如果您担心性能,可能更好的解决方案是在执行乘法运算之前验证操作数的范围。signvalue1*Math.signvalue2!=Math.signresult应该可以做到这一点,但我不是100%确定。我没有意识到Guava库有这个功能。这对我很有用。谢谢:我不知道Guava库有这个功能。这对我很有用。谢谢: