Объяснение приведения / преобразования int / double в C # - PullRequest
11 голосов
/ 31 марта 2010

Я кодировал некоторые расчеты (я скопировал ниже очень упрощенный пример того, что я сделал), например CASE2, и получил плохие результаты. Рефакторинг кода, как CASE1, и работал нормально. Я знаю, что в CASE 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) к int и вызывает раунд деления до 5, затем снова приводит к удвоению и преобразуется в 5.0.

CASE3 и CASE 4 также исправляют проблему.

Ответы [ 4 ]

13 голосов
/ 31 марта 2010
  1. 5 + 6 - целое число 11; который вы затем применяете к удвоению (в задании) и делению на два; 5,5
  2. 5 + 6 - целое число 11; целое число 11/2 = 5 в целочисленной арифметике, которую вы затем приводите к удвоению (в назначении)
  3. 5,0 + 6,0 - двойная 11,0; разделить на двойной 2,0, давая двойной 5,5
  4. 5 + 6 - целое число 11; существует неявное приведение к удвоению 11,0 для деления, затем деление двойного 2,0 дает двойное 5,5
5 голосов
/ 31 марта 2010

Чтобы немного расширить (правильный) ответ Марка, целые числа интерпретируются как целые числа, тогда как числа с десятичными точками интерпретируются как двойные. Чтобы объявить целое число буквальным двойным, добавьте к нему «D»:

        //CASE 2b, result 5.5
        double auxMedia2b = (5D + 6D) / 2;
1 голос
/ 31 марта 2010

Вы правы. Случай 2 использует целочисленную арифметику до тех пор, пока не будет выполнено присваивание. Вы также можете решить проблему, выполнив явное приведение:

double auxMedia1 = ((double) (5 + 6)) / 2;
1 голос
/ 31 марта 2010
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;

Результатом операции (5 + 6) является целое число. Потому что оба операнда имеют тип integer. Затем компилятор выполняет 11/2, где оба операнда также являются целыми числами. Результат последнего деления, очевидно, равен 5, потому что это целочисленное деление (не знаю правильного английского слова).

...