Как округлить десятичное значение до 2 десятичных знаков (для вывода на страницу) - PullRequest
582 голосов
/ 03 октября 2008

При отображении значения десятичной дроби в настоящее время с .ToString(), это точно, как 15 знаков после запятой, и так как я использую его для представления долларов и центов, я хочу, чтобы результат был только 2 знака после запятой.

Использую ли я для этого вариант .ToString()? 1005 *

Ответы [ 15 ]

9 голосов
/ 25 октября 2012

Ни один из них не сделал именно то, что мне было нужно, чтобы заставить 2 д.п. и округлить до 0.005 -> 0.01

форсирование 2 д.п. требует повышения точности на 2 д.п. чтобы у нас было минимум 2 д.п.

затем округление, чтобы убедиться, что у нас не более 2 д.п.

Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)

6.665m.ToString() -> "6.67"

6.6m.ToString() -> "6.60"
8 голосов
/ 24 августа 2017

Ответ с наибольшим рейтингом описывает метод форматирования строкового представления десятичного значения, и он работает.

Однако, если вы действительно хотите изменить сохраненную точность на фактическое значение, вам нужно написать что-то вроде следующего:

public static class PrecisionHelper
{
    public static decimal TwoDecimalPlaces(this decimal value)
    {
        // These first lines eliminate all digits past two places.
        var timesHundred = (int) (value * 100);
        var removeZeroes = timesHundred / 100m;

        // In this implementation, I don't want to alter the underlying
        // value.  As such, if it needs greater precision to stay unaltered,
        // I return it.
        if (removeZeroes != value)
            return value;

        // Addition and subtraction can reliably change precision.  
        // For two decimal values A and B, (A + B) will have at least as 
        // many digits past the decimal point as A or B.
        return removeZeroes + 0.01m - 0.01m;
    }
}

Пример модульного теста:

[Test]
public void PrecisionExampleUnitTest()
{
    decimal a = 500m;
    decimal b = 99.99m;
    decimal c = 123.4m;
    decimal d = 10101.1000000m;
    decimal e = 908.7650m

    Assert.That(a.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("500.00"));

    Assert.That(b.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("99.99"));

    Assert.That(c.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("123.40"));

    Assert.That(d.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("10101.10"));

    // In this particular implementation, values that can't be expressed in
    // two decimal places are unaltered, so this remains as-is.
    Assert.That(e.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("908.7650"));
}
7 голосов
/ 23 августа 2011

Вы можете использовать system.globalization для форматирования числа в любом необходимом формате.

Например:

system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");

Если у вас есть decimal d = 1.2300000, и вам нужно обрезать его до 2 десятичных знаков, то его можно напечатать следующим образом: d.Tostring("F2",ci);, где F2 - форматирование строки до 2 десятичных знаков, а ci - локаль или cultureinfo.

для получения дополнительной информации проверьте эту ссылку
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

6 голосов
/ 14 октября 2016

Ответ Майка М. был идеален для меня в .NET, но .NET Core не имеет метода decimal.Round на момент написания.

В .NET Core мне пришлось использовать:

decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);

Хакерский метод, включая преобразование в строку:

public string FormatTo2Dp(decimal myNumber)
{
    // Use schoolboy rounding, not bankers.
    myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);

    return string.Format("{0:0.00}", myNumber);
}
4 голосов
/ 25 июня 2016

https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx

Эта ссылка подробно объясняет, как вы можете решить свою проблему и что вы можете сделать, если хотите узнать больше. Для простоты, то, что вы хотите сделать, это

double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");

если вы хотите это для валюты, вы можете сделать это проще, набрав «C2» вместо «F2»

...