Как округлить значение 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"