Деление с плавающей запятой возвращает целые числа

Я хочу рассчитать среднее значение двух чисел с плавающей запятой, но независимо от ввода, я получаю целое число.

Что мне делать, чтобы сделать эту работу?

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

Извините, если кто-то ответил одинаково (я не читал все ответы)