2013-12-19 2 views
1

Моя проблема слишком странно, Brief:Странный результат в C#

double a = 1/2; 
MessageBox.Show(a.ToString()); 

Это показывает 0 Я попытался с decimal, float, но это всегда 0

+3

Поскольку целочисленное деление 1/2 равно нулю. Не имеет значения, к чему вы назначили ноль. –

+0

вам нужно понять разницу и способ, с помощью которого компилятор обрабатывает ваши данные! (int) 1/(int) 2 будет иметь результат int! – WhileTrueSleep

+0

Мораль этой истории состоит в том, что ** анализ типов выражения не зависит от того, что ему присваивается ** для большинства выражений в C#. '1/2' не изменяется в значении только потому, что вы назначаете его двойным. (Исключением из этого правила являются lambdas, которые меняют свой смысл в зависимости от того, для чего они назначены.) –

ответ

11

вам нужно написать:

double a= 1/2.0d; 

Деление int на int компилятор производит int и после присваивает его double.

Это то же самое, как написание:

int resultInt = 1/2; 
double a = resultInt; 

Указав в вашей работе 2.0d вы явно проявить свое намерение произвести double после DeVision.

+1

или также 1.0/2 :-) – Grundy

+0

Лично я предпочитаю продвигать числитель, поскольку он немного яснее. – Bathsheba

4

1 и 2 оба считаются целыми константами. Результат int, деленный на int, является еще одним int, прежде чем он будет отлит до double. Укажите компилятору, что хотя бы одна из констант двойная, путем ее суффикса d или предоставления десятичной точки.

например.

double a = 1d/2d; 
5

Деление выполняется в целочисленной арифметики которая означает, что вы потеряете точность перед тем результат присваивается вашему double типа.

Продвиньте один из литералов до double, чтобы заставить вычисление выполнить в с плавающей запятой. т.е. написать

double a = 1.0/2; 
2

Попробуйте это:

двойной а = (дважды) 1/(двойной) 2;

С уважением,

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