Как округлить значение float в C#?

у меня проблема с округлением значения float. У меня есть значение float, которое установлено 0.8, но в коде C# это как-то 0.80000000000000004.

поэтому я хочу округлить его, чтобы он стал 0,8.

Я пробовал:

float roundedFloatvalue = (float)Math.Round((Decimal)floatvalue, 2, MidpointRounding.AwayFromZero);

и:

float roundedFloatvalue = Truncate(floatvalue, 2);

public static float Truncate(float value, int digits)
{
    double mult = Math.Pow(10.0, digits);
    double result = Math.Truncate(mult * value) / mult;
    return (float)result;
}

Кажется, что я не могу получить 0.80000000000000004, чтобы быть 0.8, и я не знаю, почему любой из вышеперечисленных не работает.

3 ответов


вы не можете выразить 0.8 точно как двоичное значение с плавающей запятой, так как 0.8 не представляется в двоичной с плавающей запятой. Обязательное чтение по этой теме -Что Каждый Компьютерщик Должен Знать Об Арифметике С Плавающей Запятой.

можно использовать decimal вместо этого, который представляет числа с плавающей запятой и могут представлять 0.8 точно. Или вы можете продолжить использовать двоичную плавающую точку, но отображать только ограниченное количество цифр после запятой.

чтобы получить значение в decimal переменной, округленное до двух знаков после запятой, вы пишете:

decimal decimalValue = Math.Round((decimal)floatValue, 2);

Это потому, что есть is нет представления float что это ровно 0.8. Вы могли бы использовать decimal вместо этого, который является decimal тип с плавающей запятой вместо бинарные тип с плавающей запятой, или вы можете просто отформатировать число соответствующим образом при его отображении.


обычно не нужно округлить число с плавающей запятой при расчете:

0.80000000000000004 очень близко к 0.8

(если 0.0...04 важно, почему вы используете float, а не двойной?)

место, куда вы хотите округлить значение конечный вывод; в этом случае вы можете использовать форматирование:

  float x = 0.80000000000000004F;
  Console.Write(x.ToString("G1")); // or "F1"