Округление до 2 знаков после запятой в C#
Как я могу умножить две дроби и округлить результат до 2 знаков после запятой?
например, если уравнение равно 41.75 x 0.1, результат будет равен 4.175. Если я сделаю это на c# с десятичными знаками, он автоматически округлится до 4.18. Я хотел бы округлить до 4,17.
Я попытался использовать математику.Этаж, но он просто округляется до 4.00. Вот пример:
Math.Floor (41.75 * 0.1);
4 ответов
на Math.Round(...)
функция имеет перечисление, чтобы сказать ему, какую стратегию округления использовать. К сожалению, эти два определения не совсем соответствуют вашей ситуации.
два режима округления средней точки:
- AwayFromZero - когда число находится на полпути между двумя другими, оно округляется до ближайшего числа, которое находится от нуля. (Aka, round up)
- ToEven - когда номер находится на полпути между двумя другими, оно округляется к ближайшему четному числу. (Будет Благосклонен .16 более .17, а .18 более .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;
}
public double RoundDown(double number, int decimalPlaces)
{
return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}
нет встроенной поддержки для точной этаж/ceillin в C#.
однако вы можете имитировать функциональность, умножая число, пол, а затем делить на тот же множитель.
например,
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
не идеальное решение, но должно работать, если их количество невелико.
еще одно решение-сделать округление к нулю от округления от нуля. Должно быть что-то вроде этого:
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;
}
}