2013-12-04 4 views
2
int h1 = 2; 
int d1 = 4; 
decimal c1 = d1/(d1+h1); 
Console.WriteLine("{0:F9}", c1); 

Консоль показывает 00000000000, но я ожидал увидеть 0,6666666 и, возможно, 7 в конце. В чем проблема? Я пробовал разные методы, но всегда вижу 0,00000000 ...Не удается сделать деление

+6

" В чем проблема?" Ваше ожидание. Результат [правильный] (http://stackoverflow.com/a/20382174/96780). –

+2

Вы должны забрать книгу о типах данных в C# :) –

+2

Почему так много голосов, это похоже на законный вопрос и легкую ошибку новобранец. – Magnus

ответ

16

Это потому, что вы делаете целочисленное деление. Вы должны бросить одно значение в десятичных, чтобы сделать десятичное деление:

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); 
+2

Просто забыли про кастинг после нескольких других языков программирования ... Спасибо –

+2

Первые и четвертые полагаются на их правильность на то, что целочисленное добавление всегда согласуется с десятичной добавкой. Лучшая практика здесь заключалась бы в том, что h1 и d1 должны быть десятичными знаками, а не полагаться на актерский состав. –

1

вашего d1 и h1 являются ИНТ так результат первым отлитый в int и после того, как он назначен c1, отбрасывая d1 в десятичной будет решить вашу проблему

Смежные вопросы