Округление до середины десятичной точки с использованием только ToString

Я знаю это C# имеет несколько вариантов форматирования десятичных чисел с некоторой расширенной логикой в ToString() метод, как, например,

double d1 = 1.3333;
double d2 = 1.6666;
string d1Str = d1.ToString("#0.00"); // 1.33
string d2Str = d2.ToString("#0.00"); // 1.67

Это здорово, мое число округляется до второго знака после запятой. Но что, если я хотел бы округлить до шага 0.05 вместо 0.01? Есть ли способ использовать ToString() метод аналогичным образом округлить значение не до заданного размера шага (например, 0.05)?

Примечание: я знаю, что мог бы сделать что-то вроде этого:

(Math.Round(1.33333*20)/20).ToString();

но вопрос в том, чтобы получить этот результат с помощью ToString() только.

1 ответ

Возможно ли для вас создать перегрузку расширения для ToString() для этих компонентов?

Если это так, вы можете написать что-то вроде:

public static class DoubleStaticExtension
{
    public static string ToString(this double value, string format, int decimalToRoundHalfwayAt)
    {
        int modifier = 2 * (int)Math.Pow(10, decimalToRoundHalfwayAt -1 );
        return (Math.Round(value * modifier, MidpointRounding.AwayFromZero) / modifier).ToString(format);
    }
}

Называя это с

        double d = 9.333333;
        string result = d.ToString("#0.00", 2);

Дал бы результат 9,35

А также

    double d = 9.333333;
    string result = d.ToString("#0.00", 1);

Дал бы результат 9,50

Другие вопросы по тегам