Ammar Shaukat Ответов: 4

C# странное поведение с оператором /


Может ли кто-нибудь сказать мне, почему следующее утверждение в C# вычисляется как int result 2 вместо 2.5
float f = 5 / 2;
Console.WriteLine(f);

Тот же код работает на языке Си и дает результат 2.0000, а не 2.5000
float f = 5/2;
printf("%f",f);

а C++ работает так же, как и C#, и дает на выходе 2
float f = 5/ 2;
cout<<f; 


Что я уже пробовал:

Я пытался исследовать это на разных форумах . Это довольно простая концепция, поэтому я разместил ее здесь, чтобы узнать мнение экспертов по этому поводу.

4 Ответов

Рейтинг:
24

Dave Kreskowiak

Это потому, что вы указываете два целых числа (5 и 2), а не значения с плавающей запятой.

Измените код на (в C#):

float f = 5f / 2f;
Console.WriteLine(f);


В большинстве языков, если вы не укажете десятичное точечное значение (5 вместо 5.0), это значение будет рассматриваться как целое. Целочисленное деление никогда не вернет значение с плавающей запятой, поэтому вы получите 2 вместо 2,5.


Ammar Shaukat

означает, что если оператор divide имеет числа int с обеих сторон, он будет рассматривать все вычисление как целые числа ( скорее всего, произойдет неявное приведение )

Dave Kreskowiak

В правой части выражения нет неявного приведения. Поскольку вы не выражали 5 и 2 как любой плавающий тип, они интерпретируются как целые числа. Единственное неявное приведение, сделанное в этом операторе, - это когда выражение справа вычисляется и собирается быть назначенным переменной слева. Ваше выражение действительно такое:

    float f = (float)( (int)5 / (int)2 );

что в конечном итоге приводит к такой оценке:
    float f = (float)( 2 );

что в конечном итоге заканчивается так:
    float f = 2f;


Существуют различные способы указания типа постоянного значения:
< pre lang=C# " >
int c = 2;
поплавок f = 5.0 F;
двойной d = 4,0;
двойной d = 4,0 D;
двойной d = (двойной)4;
десятичное число d = 6,0 м;
десятичное число d = (десятичное число)6.3;

Hassaan Akbar

я хотел бы добавить.. (float) (5/2) также вернет 2, потому что мы набираем тип после того, как он уже был внутренне приведен к int.

Некоторые правильные способы таковы,

5f / 2
5 / 2f
5.0/2
5/2.0
(плавающий)5/2



В более длинных формулах обычно достаточно ввести первые вычисления в соответствии с правилом DMAS

например, следующая формула вернет правильный результат,

(5/2.0 + 3*6.0)(324 + 452)+ (32+ 341/2.0)

Рейтинг:
1

jeron1

Взгляните на этот[^] нить, она имеет дело с аналогичным вопросом.


Рейтинг:
1

Mobeen Rashid

В C# по умолчанию оператор / возвращает результат в System. Int32.

System.Int32 answer = 5 / 2;

если вы хотите получить ответ в float или double, просто выполните явное приведение.
decimal answerInDeciaml = (decimal)5 / 2;


Рейтинг:
0

Aitzaz Ahsan

float f=5f/2;

попробуйте это сделать по умолчанию, результат будет показан в целочисленных значениях, которые он 5&2 трактует как целое число и возвращает целочисленные значения.