почему 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 не является ассоциативной; это боль, но есть компромисс.