Продолжайте округлять до указанной цифры, если не ноль

1

Я хочу округлить до десятичных значений до двух точек. Но для любого числа, которое меньше 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;
    }
Теги:
math

1 ответ

6
Лучший ответ

Но для любого числа, которое меньше 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;
}
  • 0
    Мне это нравится! Поцелуй это путь.
  • 0
    Да, вы правы относительно разницы между округлением и отклонением от нуля. Изменение тела метода :).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню