Это потому, что вы делаете целочисленное деление. Вы должны бросить одно значение в десятичных, чтобы сделать десятичное деление:
int h1 = 2;
int d1 = 4;
decimal c1 = (decimal)d1/(d1 + h1);
В принципе, вы можете перевести текущее проблемное поведение как:
decimal c1 = (decimal)(d1/(d1 + h1));
decimal c1 = (decimal)(4/(2 + 4));
decimal c1 = (decimal)(4/6);
decimal c1 = (decimal)(0); <-- Integer division
decimal c1 = 0m;
Вот почему вам нужен либо числитель или знаменатель быть явно десятичным.
Также, когда вы делаете кастинг, это совершенно не имеет значения, вам просто нужно вызвать десятичное деление. Эти 4 линий имеют точно такой же результат:
decimal c1 = (decimal)d1/(d1 + h1);
decimal c2 = d1/((decimal)d1 + h1);
decimal c3 = d1/(d1 + (decimal)h1);
decimal c4 = d1/(decimal)(d1 + h1);
" В чем проблема?" Ваше ожидание. Результат [правильный] (http://stackoverflow.com/a/20382174/96780). –
Вы должны забрать книгу о типах данных в C# :) –
Почему так много голосов, это похоже на законный вопрос и легкую ошибку новобранец. – Magnus