Объяснение кастинга/преобразования, международного/двойного в C#

Я кодировал некоторый материал вычисления (я скопировал ниже действительно 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 также решают проблему.

11
задан Oscar Foley 31 March 2010 в 18:57
поделиться

4 ответа

  1. 5 + 6 - целое число 11; который вы затем приводите к удвоению (в присваивании) и делите на два; 5.5
  2. 5 + 6 - целое число 11; целое число 11/2 = 5 при целочисленной арифметике, которое вы затем преобразуете в double (в присваивании)
  3. 5.0 + 6.0 равно double 11.0; делим на double 2.0, получаем double 5.5
  4. 5 + 6 - целое число 11; существует неявное приведение к double 11.0 для деления, затем деление double 2.0 дает double 5.5
13
ответ дан 3 December 2019 в 05:57
поделиться

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

        //CASE 2b, result 5.5
        double auxMedia2b = (5D + 6D) / 2;
5
ответ дан 3 December 2019 в 05:57
поделиться

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

double auxMedia1 = ((double) (5 + 6)) / 2;
1
ответ дан 3 December 2019 в 05:57
поделиться
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;

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

1
ответ дан 3 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: