Объяснение литья/преобразования int/double в С#

Я закодировал некоторые вещи калькуляции (я скопировал ниже действительно упрощенного примера того, что я сделал), как 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, затем снова бросается в double и преобразуется в 5.0.

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

Ответ 1

  • 5 + 6 - целое число 11; которые вы затем бросаете в двойное (в задании) и делите на два; 5,5
  • 5 + 6 - целое число 11; целое число 11/2 = 5 при целочисленной арифметике, которое вы затем выполняете в двойном (в задании)
  • 5.0 + 6.0 - double 11.0; разделите на двойной 2.0, давая двойной 5.5
  • 5 + 6 - целое число 11; есть неявный приведение к удвоению 11.0 для деления, затем разделите double 2.0, давая double 5.5

Ответ 2

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

        //CASE 2b, result 5.5
        double auxMedia2b = (5D + 6D) / 2;

Ответ 3

//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;

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

Ответ 4

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

double auxMedia1 = ((double) (5 + 6)) / 2;