2013-11-30 2 views
0

я провел свою программу, и я увидел в журнале программы, что один из моих аргументов является неправильным, так что я пытался отладить ее,кода Java производит неверный результат

я пытался выполнить это:

double test = ((9 + 13) * (9 + 1594) * (2157 + 13) * (2157 + 1594)); 

ответ должен быть 287053602220, но это дает мне -7.09206612E8

при попытке

double t1 = (9 + 13) * (9 + 1594); 
    double t2 = (2157 + 13) * (2157 + 1594); 
    test = t1 * t2; 

Это дает мне настоящий результат

в чем причина?

+0

Ужасный вопрос название! Пожалуйста, будьте более конкретными в своих вопросах, чтобы помочь людям находить вопросы. –

+0

Этот ответ, конечно, совершенно правильный, он просто не соответствовал вашим ожиданиям. Все части этого выражения являются 'int', поэтому используется семантика 'int'. 287053602220 не может быть представлен как 'int', он переносится на -709206612 (который затем преобразуется в' double', когда уже слишком поздно). – harold

ответ

5

Первое уравнение вычисляется как целое и затем преобразуется в двойное. И вы распространяете INTEGER_MAX и попадаете в отрицательное значение. Первый равно это:

//temp extends INTEGER_MAX so it gets negative. 
int temp = (9 + 13) * (9 + 1594) * (2157 + 13) * (2157 + 1594)); 
double test = = (double) temp; 

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

Диапазон значений целых чисел от -2,147,483,648 до 2,147,483,647. Если ваши номера выходят за пределы диапазона, снова начинается с другой стороны. Таким образом, ваш номер становится отрицательным. Double имеет диапазон от 4.94065645841246544e-324d до 1.79769313486231570e + 308d. Преобразуя в ваше уравнение, вы расширяете диапазон значений, и ваш номер не выходит за пределы диапазона и начинается с отрицательного диапазона.

1

Вы можете видеть преобразование типа, (9 + 13), (9 + 1594), (2157 + 13), (2157 + 1594) - это все int, поэтому оно выполняется с помощью int после получения результата конвертировать в флот. Вы можете попробовать double test = ((float) (9 + 13) * (float) (9 + 1594) * (float) (2157 + 13) * (float) (2157 + 1594));

0

int Множественный int, ответ также int, поэтому он не дает вам правильного ответа, вы можете попробовать ((9L + 13) * (9 + 1594) * (2157 + 13) * (2157 + 1594)), тогда ответ правильный

Смежные вопросы