Объяснение литья/преобразования 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;