Рубрики
Без рубрики

Java 8 – Математические точные примеры

– Java 8 – Математические точные примеры

Java 8 представила новые методы в классе Math , которые будут вызывать исключение ArithmeticException для обработки переполнений. Эти методы состоят из дополнения , вычитания точного , Мультипликативный эффект , Инкрементальный эффект , Уменьшениеакт и отрицатьэкспакт с int и длинные аргументы. Кроме того, существует статический toIntExact метод для преобразования длинного значения в int , который также выдает Арифметическое исключение .

До Java 8 программисту приходилось вручную отлаживать, чтобы найти переменные в коде, которые переполняются. Я был очень рад узнать, что Java 8 представила новый набор методов, которые создают исключение при переполнении результата. Для многих разработчиков это изменение не имеет существенного эффекта, но для скромных разработчиков, таких как я, это, безусловно, повлияет на время, потраченное на то, чтобы почесать голову, чтобы понять, почему результат неправильный, или принять сложные меры предосторожности, чтобы избежать переполнения.

1. Математика.Мультипликативный эффект

Этот пример демонстрирует разницу между обычным умножением и новым мультипликативным действием

package com.mkyong.exactmethods;

package com.mkyong;

public class MultiplyExact {

    public static void main(String[] args) {

        int x = Integer.MAX_VALUE; //( = 2 147 483 647)
        int y = Integer.MAX_VALUE;
        Object z;

        System.out.println("---Before Java 8---");
        z = x * y;
        System.out.println("z : " + z);

        System.out.println("\n---Since Java 8---");
        try {

            z = Math.multiplyExact(x, y);

        } catch (ArithmeticException e) {

            System.out.println(e.getMessage()); //Java 8 throws integer overflow

            z = Math.multiplyExact((long) x, (long) y);
            System.out.println("z : " + z);
        }

        if (z instanceof Long) {
            System.out.println("\n> yuuuup z is Long");
        }
    }
}

Выход:

---Before Java 8---
z : 1

---Since Java 8---
integer overflow
z : 4611686014132420609

> yuuuup z is Long

2. Обнаружение и обработка переполнения

Пример, в котором мы обрабатываем переполнение для целого числа и определяем переполнение для длинного .

package com.mkyong.exactmethods;

public class MultiplyExact2 {

    public static void main(String[] args) {

        int x = 1000000;
        int y = 1000000;
        long a = Long.MAX_VALUE; //( = 9 223 372 036 854 775 807)
        long b = Long.MAX_VALUE;
        Object z, c;

        System.out.println("---Before Java 8---");
        z = x * y;
        c = a * b;
        System.out.println("z : " + z);
        System.out.println("c : " + c);

        System.out.println("\n---Since Java 8---");
        try {
            z = Math.multiplyExact(x, y);
            c = Math.multiplyExact(a, b);
        } catch (ArithmeticException e) {
            try {
                z = Math.multiplyExact((long) x, (long) y);
                c = null;
            } catch (ArithmeticException ex) {
                z = null;
            }
        }

        if (z instanceof Integer) {
            System.out.println("z is instance of Integer: " + z);
        }
        if (z instanceof Long) {
            System.out.println("z is instance of Long: " + z);
        } else {
            System.out.println("Overflow for z");
        }

        if (c instanceof Integer) {
            System.out.println("Instance of Integer: " + c);
        }
        if (c instanceof Long) {
            System.out.println("Instance of Long: " + c);
        } else {
            System.out.println("Overflow for c");
        }
    }
}

Выход:

---Before Java 8---
z : -727379968
c : 1

---Since Java 8---
z is instance of Long: 1000000000000
Overflow for c

3. Все ххх Точные методы

Пример, демонстрирующий все новые xxx Точные методы

package com.mkyong.exactmethods;

public class AllExactMethods {
	
	public static void main(String[] args){
		int x = 10000;
		int y = 10000;
		Object z;
		
		z = Math.addExact(x, y);
		System.out.println("addExact: " + x + " + " + y + " = " + z);
		z = Math.subtractExact(x, y);
		System.out.println("subtractExact: " + x + " - " + y + " = " + z);
		z = Math.multiplyExact(x, y);
		System.out.println("multiplyExact: " + x + " * " + y + " = " + z);
		z = Math.incrementExact(x);
		System.out.println("incrementExact: " + x + " + 1 = " + z);
		z = Math.decrementExact(y);
		System.out.println("decrementExact: " + y + " - 1 = " + z);
		z = Math.negateExact(x);
		System.out.println("negateExact: " + x + " * -1 = " + z);
	}
}

Выход:

addExact: 10000 + 10000 = 20000
subtractExact: 10000 - 10000 = 0
multiplyExact: 10000 * 10000 = 100000000
incrementExact: 10000 + 1 = 10001
decrementExact: 10000 - 1 = 9999
negateExact: 10000 * -1 = -10000

Рекомендации

  1. “Java 8 в действии” Рауля-Габриэля Урмы, Марио Фуско и Алан Майкрофт
  2. Математика – Java 8 API

Оригинал: “https://mkyong.com/java8/java-8-math-exact-examples/”