Я хочу округлить до десятичных значений до двух точек. Но для любого числа, которое меньше 0,01, я хочу вернуть 0,01.
RoundUp(0.146,2) should return 0.15
RoundUp(0.0003,2) should return 0.01
В С# я в настоящее время использую Math.Round
с параметром MidpointRounding.AwayFromZero
, но для
Math.Round(0.0003, 2, MidpointRounding.AwayFromZero);
он возвращает 0
.
Есть ли встроенный метод в пространстве имен Math, который я могу использовать для получения желаемого поведения?
В настоящее время я использую этот метод
private double GetRoundUpValue(double price, int roundUpto)
{
Debug.Assert(roundUpto == 2 || roundUpto == 3);
var val = Math.Round(price, roundUpto, MidpointRounding.AwayFromZero);
Double minValue = roundUpto == 2 ? 0.01 : 0.001;
return val < minValue ? minValue : val;
}
Но для любого числа, которое меньше 0,01, я хочу вернуть 0,01.
Тогда почему бы не сохранить его просто и просто использовать что-то вроде этого:
Math.Max(Math.Round(0.0003, 2, MidpointRounding.AwayFromZero), 0.01);
Или, если вам нужно что-то более общее, округлить до десяти знаков после запятой, используйте что-то вроде этого:
private double GetRoundUpValue(double price, int places)
{
var minValue = Math.Pow(0.1, places);
return Math.Max(Math.Round(price, places, MidpointRounding.AwayFromZero), minValue);
}
Также обратите внимание, что "округление от нуля" - это не то же самое, что "округление" (для этого вы можете посмотреть Math.Ceiling
). Поэтому я бы рекомендовал либо изменить имя этого метода, либо его тело, чтобы более четко понять, что на самом деле происходит внутри него.
Например:
private double GetRoundUpValue(double price, int places)
{
var scale = Math.Pow(10, places);
return Math.Ceiling(price * scale) / scale;
}