Как я могу проверить, приведет ли перемножение двух чисел в Java к переполнению?

14

java,overflow,math,long-integer,

Java, переполнение, математика, длинное целое,

Ответов: 87


74 принят

Java 8 имеет bи т. Д. Для ints и long maximum = Long . signum ( a ) == Долго . signum ( b ) ? Долго . MAX_VALUE : Длинные . MIN_VALUE ; if ( a ! = 0 && ( b > 0 && b > максимум / a || b < 0 && b < максимумif (a != 0 && b > Long.MAX_VALUE / a) { // Overflow } / a )) { // Переполнение } . Они бросают неконтролируемый переполнение. a = 5 b = 2 2 > 10 / 5 a = 2 b = 5 5 > 10 / 2 a = -5 b = 2 2 > -10 / -5 a = -2 b = 5 5 > -10 / -2 a = 5 b = -2 -2 < -10 / 5 a = 2 b = -5 -5 < -10 / 2 a = -5 b = -2 -2 < 10 / -5 a = -2 b = -5 -5 < 10 / -2


54

Если aи bоба положительные, то вы можете использовать:

a

Если вам нужно иметь дело с положительными и отрицательными цифрами, то это сложнее:

b

Вот небольшая таблица, которую я взбивал, чтобы проверить это, делая вид, что переполнение происходит при -10 или +10:

ArithmeticException

17

Существуют библиотеки Java, которые обеспечивают безопасные арифметические операции, которые проверяют длительное переполнение / недополнение. Например, LongMath.checkedMultiply (long a, long b) Guava возвращает произведение aи b, если оно не переполняется, и бросает, a * bесли longпереполнение в longарифметике со знаком.


6

Вместо этого вы можете использовать java.math.BigInteger и проверить размер результата (не проверял код):

BigInteger bigC = BigInteger.valueOf(a) * multiply(BigInteger.valueOf(b));
if(bigC.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0) {
  c = Long.MAX_VALUE;
} else {
  c = bigC.longValue()
}

6

Используйте логарифмы, чтобы проверить размер результата.

Java, переполнение, математика, длинное целое,
Похожие вопросы