2015-01-13 5 views
3
Double milisecondsInYear = 365*24*3600*1000; 

Это 1.7e9Почему эти два имеют разные значения?

Но если бы я использовал

Double milisecondsInYear = 365*24*3600*1000.; 

я получил правильный ответ 3.15E10

+2

Кроме правильных ответов вывешенные. Ваша первая строка не будет компилироваться. С левой стороны у вас есть тип объекта «Double», а с правой стороны у вас есть примитив 'int', и они не назначаются совместимыми. Поэтому в следующий раз отправьте реальный код, который вы использовали. – SubOptimal

+0

Я набрал это в телефоне. Он автоматически исправляется. Сожалею. – Jumpworker

+0

грустно, что я не мог добавить только смайлик для вашего ответа. :-) – SubOptimal

ответ

1

Числа в Java являются int s, если не указано иное.

При добавлении ., вы будете иметь double расчеты (с 1000.0 является double) вместо int, что соответствует (в отличие от int).

1

Первый выполняет целочисленную математику, поскольку все числа являются целыми числами, результатом является целое число (которое затем расширяется до double). Недостаточно диапазона int. A double или long есть. Таким образом, вы можете также использовать

double millisecondsInYear = (365L * 24 * 3600 * 1000); 
System.out.println(millisecondsInYear); 

расширить до long первой. Вышеупомянутое также выводит «3.1536E10».

3

Из-за переполнения. 365*24*3600*1000 не помещается в int (который представляет собой подписанное 32-битное значение). Если вы напишете, что как 365L*24*3600*1000, то необходимые акции будут проводиться в правильном порядке, и результат будет long, который может соответствовать этому номеру.

Во второй строке у вас есть дополнительный символ, точка в конце - это делает число числом с плавающей запятой, таким образом, вы теряете точность, но можете действительно делать умножения.

0

Порядок и оценка в зависимости от типа, который вы используете. Вот почему вы получаете разные ответы.

+0

Спасибо всем. Эта ошибка немного задержала меня. – Jumpworker

+2

Как здесь порядок? – Tom

5

Поскольку 365, 24, 3600 и 1000 все int литералы, расчет производится с использованием int с. Переполнение переполняется, потому что истинное значение превышает Integer.MAX_VALUE. Помещая точку в конце, вы превращаете этот последний литерал в литерал double. Это не очень надежный способ исправить это, потому что умножение первых трех чисел все еще выполняется с использованием int s. Лучший способ справиться с этим - сделать первый номер long или double буквальным.

365L*24*3600*1000 

или

365.0*24*3600*1000 
Смежные вопросы