Double milisecondsInYear = 365*24*3600*1000;
Это 1.7e9
Почему эти два имеют разные значения?
Но если бы я использовал
Double milisecondsInYear = 365*24*3600*1000.;
я получил правильный ответ 3.15E10
Double milisecondsInYear = 365*24*3600*1000;
Это 1.7e9
Почему эти два имеют разные значения?
Но если бы я использовал
Double milisecondsInYear = 365*24*3600*1000.;
я получил правильный ответ 3.15E10
Числа в Java являются int
s, если не указано иное.
При добавлении .
, вы будете иметь double
расчеты (с 1000.0
является double
) вместо int
, что соответствует (в отличие от int
).
Первый выполняет целочисленную математику, поскольку все числа являются целыми числами, результатом является целое число (которое затем расширяется до double
). Недостаточно диапазона int
. A double
или long
есть. Таким образом, вы можете также использовать
double millisecondsInYear = (365L * 24 * 3600 * 1000);
System.out.println(millisecondsInYear);
расширить до long
первой. Вышеупомянутое также выводит «3.1536E10».
Из-за переполнения. 365*24*3600*1000
не помещается в int (который представляет собой подписанное 32-битное значение). Если вы напишете, что как 365L*24*3600*1000
, то необходимые акции будут проводиться в правильном порядке, и результат будет long
, который может соответствовать этому номеру.
Во второй строке у вас есть дополнительный символ, точка в конце - это делает число числом с плавающей запятой, таким образом, вы теряете точность, но можете действительно делать умножения.
Порядок и оценка в зависимости от типа, который вы используете. Вот почему вы получаете разные ответы.
Спасибо всем. Эта ошибка немного задержала меня. – Jumpworker
Как здесь порядок? – Tom
Поскольку 365
, 24
, 3600
и 1000
все int
литералы, расчет производится с использованием int
с. Переполнение переполняется, потому что истинное значение превышает Integer.MAX_VALUE
. Помещая точку в конце, вы превращаете этот последний литерал в литерал double
. Это не очень надежный способ исправить это, потому что умножение первых трех чисел все еще выполняется с использованием int
s. Лучший способ справиться с этим - сделать первый номер long
или double
буквальным.
365L*24*3600*1000
или
365.0*24*3600*1000
Кроме правильных ответов вывешенные. Ваша первая строка не будет компилироваться. С левой стороны у вас есть тип объекта «Double», а с правой стороны у вас есть примитив 'int', и они не назначаются совместимыми. Поэтому в следующий раз отправьте реальный код, который вы использовали. – SubOptimal
Я набрал это в телефоне. Он автоматически исправляется. Сожалею. – Jumpworker
грустно, что я не мог добавить только смайлик для вашего ответа. :-) – SubOptimal