Почему 24 * 60 * 60 * 1000 * 1000 разделен на 24 * 60 * 60 * 1000, не равный 1000 на Java?

почему 24 * 60 * 60 * 1000 * 1000 разделен на 24 * 60 * 60 * 1000, не равный 1000 на Java?

Ответ 1

Поскольку умножение переполняет 32-битные целые числа. В 64 бит это нормально:

public class Test
{
    public static void main(String[] args)
    {
        int intProduct = 24 * 60 * 60 * 1000 * 1000;
        long longProduct = 24L * 60 * 60 * 1000 * 1000;
        System.out.println(intProduct); // Prints 500654080
        System.out.println(longProduct); // Prints 86400000000
   }
}

Очевидно, что после того, как умножение переполнилось, деление не собирается "отменить" это переполнение.

Ответ 2

Вам нужно начать с 24L * 60 *... потому что int переполняется.

Ваш вопрос BTW - это копия/вставка Головоломки 3: Длинные подразделения из Java Puzzlers;)

Ответ 3

Если вы хотите выполнить этот расчет, то вы должны либо переупорядочить операции (чтобы избежать переполнения), либо использовать больший тип данных. Реальная проблема заключается в том, что арифметика целых чисел фиксированного размера в Java не является ассоциативной; это боль, но есть компромисс.