почему 24 * 60 * 60 *1000* 1000 делится на 24 * 60 * 60 * 1000 не равно 1000 в Java? - PullRequest
13 голосов
/ 19 августа 2009

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

Ответы [ 3 ]

60 голосов
/ 19 августа 2009

Поскольку умножение переполняет 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
   }
}

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

22 голосов
/ 19 августа 2009

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

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

3 голосов
/ 19 августа 2009

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

...