Моя проблема слишком странно, Brief:Странный результат в C#
double a = 1/2;
MessageBox.Show(a.ToString());
Это показывает 0
Я попытался с decimal
, float
, но это всегда 0
Моя проблема слишком странно, Brief:Странный результат в C#
double a = 1/2;
MessageBox.Show(a.ToString());
Это показывает 0
Я попытался с decimal
, float
, но это всегда 0
вам нужно написать:
double a= 1/2.0d;
Деление int
на int
компилятор производит int
и после присваивает его double
.
Это то же самое, как написание:
int resultInt = 1/2;
double a = resultInt;
Указав в вашей работе 2.0d
вы явно проявить свое намерение произвести double
после DeVision.
1
и 2
оба считаются целыми константами. Результат int
, деленный на int
, является еще одним int
, прежде чем он будет отлит до double
. Укажите компилятору, что хотя бы одна из констант двойная, путем ее суффикса d
или предоставления десятичной точки.
например.
double a = 1d/2d;
Деление выполняется в целочисленной арифметики которая означает, что вы потеряете точность перед тем результат присваивается вашему double
типа.
Продвиньте один из литералов до double
, чтобы заставить вычисление выполнить в с плавающей запятой. т.е. написать
double a = 1.0/2;
Попробуйте это:
двойной а = (дважды) 1/(двойной) 2;
С уважением,
Поскольку целочисленное деление 1/2 равно нулю. Не имеет значения, к чему вы назначили ноль. –
вам нужно понять разницу и способ, с помощью которого компилятор обрабатывает ваши данные! (int) 1/(int) 2 будет иметь результат int! – WhileTrueSleep
Мораль этой истории состоит в том, что ** анализ типов выражения не зависит от того, что ему присваивается ** для большинства выражений в C#. '1/2' не изменяется в значении только потому, что вы назначаете его двойным. (Исключением из этого правила являются lambdas, которые меняют свой смысл в зависимости от того, для чего они назначены.) –