Я кодировал некоторый материал вычисления (я скопировал ниже действительно simplifed пример того, что я сделал) как CASE2, и получил плохие результаты. Пересмотренный код как CASE1 и хорошо работал. Я знаю, что существует неявный бросок В СЛУЧАЕ, ЕСЛИ 2, но не уверен в полной причине. Кто-либо мог объяснить меня, что точно происходит ниже?
//CASE 1, result 5.5
double auxMedia = (5 + 6);
auxMedia = auxMedia / 2;
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;
//CASE 3, result 5.5
double auxMedia3 = (5.0 + 6.0) / 2.0;
//CASE 4, result 5.5
double auxMedia4 = (5 + 6) / 2.0;
Мое предположение - то, что/2 в CASE2 бросает (5 + 6) к интервалу и заставляет раунд подразделения к 5, затем литой снова удваиваться и преобразованный в 5,0.
CASE3 и СЛУЧАЙ 4 также решают проблему.
Чтобы немного расширить (правильный) ответ Марка, целые числа интерпретируются как целые, тогда как числа с десятичной точкой интерпретируются как двойные. Чтобы объявить целое число как буквальное двойное, добавьте к нему букву "D":
//CASE 2b, result 5.5
double auxMedia2b = (5D + 6D) / 2;
Вы правы. CASE 2 использует целочисленную арифметику до тех пор, пока не будет выполнено присваивание. Вы также можете решить проблему, сделав явное приведение:
double auxMedia1 = ((double) (5 + 6)) / 2;
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;
Результат операции (5 + 6) - целое число. Поскольку оба операнда имеют целочисленный тип. Затем компилятор выполняет 11/2, где оба операнда также являются целыми числами. Результат последнего деления, очевидно, равен 5, потому что это целочисленное деление (не знаю правильного английского слова).