Округление до 2 знаков после запятой в С#
Как я могу умножить два десятичных знака и округлить результат до двух знаков после запятой?
Например, если уравнение равно 41.75 x 0.1, результат будет равен 4.175. Если я сделаю это в С# с десятичными знаками, он автоматически округляется до 4.18. Я хотел бы округлить до 4.17.
Я пробовал использовать Math.Floor, но он просто округляется до 4,00. Вот пример:
Math.Floor (41.75 * 0.1);
Ответы
Ответ 1
Функция Math.Round(...)
имеет Enum, чтобы рассказать ей, какую стратегию округления использовать. К сожалению, эти два не будут точно соответствовать вашей ситуации.
Два режима округления Midpoint:
- AwayFromZero. Когда число находится на полпути между двумя другими, оно округляется до ближайшего числа, которое находится вдали от нуля. (Aka, round up)
- ToEven. Когда число находится на полпути между двумя другими, оно округляется до ближайшего четного числа. (Будет любить 0,16 за 0,17 и 0,18 за 0,17).
То, что вы хотите использовать, - это Floor
с некоторым умножением.
var output = Math.Floor((41.75 * 0.1) * 100) / 100;
Теперь переменная output
должна иметь 4.17.
Фактически вы также можете написать функцию, которая также принимает переменную длину:
public decimal RoundDown(decimal i, double decimalPlaces)
{
var power = Convert.ToDecimal(Math.Pow(10, decimalPlaces));
return Math.Floor(i * power) / power;
}
Ответ 2
public double RoundDown(double number, int decimalPlaces)
{
return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}
Ответ 3
В С# нет встроенной поддержки прецизионного пол /ceillin.
Однако вы можете имитировать функциональность, умножив число, пол и затем разделите на один и тот же множитель.
например,
decimal y = 4.314M;
decimal x = Math.Floor(y * 100) / 100; // To two decimal places (use 1000 for 3 etc)
Console.WriteLine(x); // 4.31
Не идеальное решение, но должно работать, если число мало.
Ответ 4
Еще одно решение - сделать округление к нулю от округления до нуля.
Это должно быть примерно так:
static decimal DecimalTowardZero(decimal value, int decimals)
{
// rounding away from zero
var rounded = decimal.Round(value, decimals, MidpointRounding.AwayFromZero);
// if the absolute rounded result is greater
// than the absolute source number we need to correct result
if (Math.Abs(rounded) > Math.Abs(value))
{
return rounded - new decimal(1, 0, 0, value < 0, (byte)decimals);
}
else
{
return rounded;
}
}