Как округлить двойные значения, но сохранить конечные нули - PullRequest
8 голосов
/ 20 октября 2011

В C # я хочу функцию, которая округляет заданный дубль до заданного количества десятичных дробей. Я всегда хочу, чтобы моя функция возвращала значение (которое может быть строкой) с заданным количеством десятичных знаков. При необходимости необходимо добавить конечные нули.

Пример:

string result = MyRoundingFunction(1.01234567, 3);
// this must return "1.012"

Это просто, это просто округление и преобразование в строку. Но тут возникает проблема:

string result2 = MyRoundingFuntion(1.01, 3);
// this must return "1.010"

Есть ли удобный / стандартный способ сделать это, или мне нужно вручную добавлять конечные нули?

Любая помощь приветствуется. Обратите внимание, что в реальном приложении я не могу жестко запрограммировать количество десятичных знаков.

Ответы [ 5 ]

12 голосов
/ 20 октября 2011

Вы можете создать форматтер, как в этом примере:

int numDigitsAfterPoint = 5;
double num = 1.25d;
string result = num.ToString("0." + new string('0', numDigitsAfterPoint));

или (более просто)

string result = num.ToString("F" + numDigitsAfterPoint);

В качестве идентификатора ToString использует MidpointRounding.AwayFromZero вместоMidpointRounding.ToEven (также называется Банковским округлением).Как пример:

var x1 = 1.25.ToString("F1");
var x2 = 1.35.ToString("F1");
var x3 = Math.Round(1.25, 1).ToString();
var x4 = Math.Round(1.35, 1).ToString();

Они приведут к другому результату (потому что Math.Round обычно использует MidpointRounding.ToEven)

И обратите внимание, что внутренне ToString(), кажется, делает некоторую "магию" раньшеокругление цифр.Для двойных чисел, если вы спросите его менее 15 цифр, я думаю, что сначала округляется до 15 цифр, а затем округляется до нужного числа цифр.Смотри здесь https://ideone.com/ZBEis9

4 голосов
/ 20 октября 2011
string.format("{0:f2}", value);
3 голосов
/ 20 октября 2011

Ваше решение (делает то, что вы хотите).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            string result = MyRoundingFunction(1.01234567, 3);
            Console.WriteLine(result);
            result = MyRoundingFunction(1.01, 3);
            Console.WriteLine(result);
            Console.ReadLine();
        }

        public static string MyRoundingFunction(double value, int decimalPlaces)
        {
            string formatter = "{0:f" + decimalPlaces + "}";
            return string.Format(formatter, value);
        }
    }
}
2 голосов
/ 20 октября 2011

Вы должны сначала округлить, затем отформатировать.

String.Format("{0:0.000}", Math.Round(someValue, 2));

Что вы должны прочитать:

Math.Round

String.Format , Пользовательский числовой формат

Как вариант, вы можете использовать расширение для поддержки этого

Методы расширения

0 голосов
/ 02 ноября 2017

Просто:

decimal.Round(mydouble, 2).ToString("0.00")
...