Деление с плавающей запятой возвращает целые числа
Я хочу рассчитать среднее значение двух чисел с плавающей запятой, но независимо от ввода, я получаю целое число.
Что мне делать, чтобы сделать эту работу?
public class Program
{
public static float Average(int a, int b)
{
return (a + b) / 2;
}
public static void Main(string[] args)
{
Console.WriteLine(Average(2, 1));
}
}
Ответы
Ответ 1
В вашем коде есть две проблемы.
- Очевидный - целочисленное деление - например,
1 / 2 == 0
not 0.5
, так как результат должен быть целым
- Скрытый - Целочисленное переполнение - например.
a + b
может переполняться int.MaxValue
, и вы получите отрицательный результат
Наиболее точная реализация
public static float Average(int a, int b)
{
return 0.5f * a + 0.5f * b;
}
Тесты:
Average(1, 2); // 1.5
Average(int.MaxValue, int.MaxValue); // some large positive value
Ответ 2
Трюк заключается в том, чтобы написать выражение как 0.5 * a + 0.5 * b
, что также исключает возможность переполнения int
(признайте Дмитрия Быченко).
В настоящее время ваше выражение оценивается в целочисленной арифметике, что означает, что любая дробная часть отбрасывается.
При установке одного из значений в каждом члене в литерал с плавающей запятой все выражение вычисляется в плавающей запятой.
Наконец, если вы хотите, чтобы тип выражения был float
, используйте
0.5f * a + 0.5f * b
Суффикс f
используется для обозначения литерала float
.
Ответ 3
return (a + b) / 2F;
указывает компилятору обрабатывать число как float, иначе оно будет рассматриваться как int
.
Ответ 4
Используйте это:
public static float Average(int a, int b)
{
return (float)(a + b) / 2;
}
Ответ 5
Вы можете использовать:
(float)(a + b) / 2.0
Это вернет float
Извините, если кто-то ответил одинаково (я не читал все ответы)