关于c#:如何将十进制值舍入到2位小数(对于页面上的输出)

How do I round a decimal value to 2 decimal places (for output on a page)

当用.ToString()显示一个小数点的值时,它精确到15位小数,因为我用它来表示美元和美分,所以我只希望输出为2位小数。

我是否使用.ToString()的变体?


1
decimalVar.ToString ("#.##"); // returns"" when decimalVar == 0

1
decimalVar.ToString ("0.##"); // returns"0"  when decimalVar == 0


我知道这是一个老问题,但我看到的是一个surprised似乎在回答这一职位。

  • 不使用rounding银行家
  • 不保持的十进制值。
  • 这就是我会用:

    1
    decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);

    http:///EN一美元/图书馆/ 9s0xa85y.aspx


    1
    decimalVar.ToString("F");

    这将是:

    • 舍入到2位小数,如23.46 23.456 = >。
    • 确保有是永远的2位小数(23 23.00。= > >,= 12.5 12.5

    理想的货币和货币量的系统。

    是文档("F")方法一:http:///EN /图书馆/美元=28V的dwhawy9k % %(与vs.110 29.aspx # fformatstring感谢乔恩施耐德)


    如果你需要的只是这是显示使用的格式字符串。

    1
    String.Format("{0:0.00}", 123.4567m);      //"123.46"

    http://www.csharp-examples.net /双/字符串格式

    "M"是一个后缀的十进制。关于《小数的后缀:

    http:///EN一美元/图书馆/ 364x0z75.aspx


    给出了12.345十进制D表达=;d.tostring("C")或("string.format { 0 }:C,D)产量12.35美元。请注意,当前文化的设置包括货币符号的使用。

    请注意,使用"C"的数量从目前的数字文化。你可以重写默认到必要的精密力总是与String.Format("{0:C2}", 5.123d)C{Precision specifier}样。


    如果你想用它formatted commas以及小数点(但在货币符号),如3456789.12……

    1
    decimalVar.ToString("n2");


    有一个高得分双指已经回答到decimal.round(……),但我认为这是需要更多一点的解释是重要的事情,因为这是一个小数的性质是不是明显的。

    十进制小数位数"知道"它有许多的知识的基础上,从那里的凸轮。

    例如,可能是下面的事情:

    1
    2
    3
    4
    5
    6
    7
    Decimal.Parse("25").ToString()          =>  "25"
    Decimal.Parse("25.").ToString()         =>  "25"
    Decimal.Parse("25.0").ToString()        =>  "25.0"
    Decimal.Parse("25.0000").ToString()     =>  "25.0000"

    25m.ToString()                          =>  "25"
    25.000m.ToString()                      =>  "25.000"

    做相同的操作将在与Double给小数位数("25")为每个上述的。

    当你要到2位小数的十进制的效益约95 %的机会,这是因为它的货币,这一案例可能是95 %的精细时间:

    1
    Decimal.Parse("25.0").ToString("c")     =>  "$25.00"

    或你只是使用XAML的{Binding Price, StringFormat=c}

    我跑进一个案例在我需要的时候,十进制十进制是XML Web服务发送到Amazon’s。因为服务是complaining(originally十进制值是从SQL Server)的被发送25.1200和拒绝,(25.12是预期的格式)。

    所有我需要的是带2位小数Decimal.Round(...)到修复的问题。

    1
    2
    3
    4
    5
    6
     // This is an XML message - with generated code by XSD.exe
     StandardPrice = new OverrideCurrencyAmount()
     {
           TypedValue = Decimal.Round(product.StandardPrice, 2),
           currency ="USD"
     }

    DecimalTypedValue型,所以我也不能去ToString("N2")和需要它,让它与周围的Decimal


    这里是一个小节目linqpad程序格式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void Main()
    {
        FormatDecimal(2345.94742M);
        FormatDecimal(43M);
        FormatDecimal(0M);
        FormatDecimal(0.007M);
    }

    public void FormatDecimal(decimal val)
    {
        Console.WriteLine("ToString: {0}", val);
        Console.WriteLine("c: {0:c}", val);
        Console.WriteLine("0.00: {0:0.00}", val);
        Console.WriteLine("0.##: {0:0.##}", val);
        Console.WriteLine("===================");
    }

    这里是结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    ToString: 2345.94742
    c: $2,345.95
    0.00: 2345.95
    0.##: 2345.95
    ===================
    ToString: 43
    c: $43.00
    0.00: 43.00
    0.##: 43
    ===================
    ToString: 0
    c: $0.00
    0.00: 0.00
    0.##: 0
    ===================
    ToString: 0.007
    c: $0.01
    0.00: 0.01
    0.##: 0.01
    ===================

    数学方法。圆(十进制,Int32)


    如果值为0,则很少需要空字符串。

    1
    2
    3
    4
    5
    6
    decimal test = 5.00;
    test.ToString("0.00");  //"5.00"
    decimal? test2 = 5.05;
    test2.ToString("0.00");  //"5.05"
    decimal? test3 = 0;
    test3.ToString("0.00");  //"0.00"

    最热门的答案是错误的,浪费了10分钟(大多数)的时间。


    这是什么样的我做不需要到2,和圆上的力的关系0.005 -> 0.01

    强迫使用需要增加2对2的关系,以确保精密的关系我们有至少2

    然后,我们rounding以确保没有超过2的关系

    1
    2
    3
    4
    5
    Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)

    6.665m.ToString() ->"6.67"

    6.6m.ToString() ->"6.60"


    最高评级的答案描述了一种格式化十进制值的字符串表示形式的方法,它可以工作。

    但是,如果您实际想要更改保存到实际值的精度,则需要编写如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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;
        }
    }

    单元测试示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [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"));
    }


    你可以使用在任何system.globalization到所需格式的数字格式。

    例如:

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

    如果你有一个你需要的decimal d = 1.2300000装饰它的2位小数,然后它可以印刷在这样d.Tostring("F2",ci);F2是到2位小数和字符串formating CI是本地或区域性。

    检查这个链接的更多信息http:///EN一美元/图书馆/ dwhawy9k.aspx


    迈克是完美的答案。如果我在线网络的核心网络,而不是有一个decimal.Round法在写作的时间。

    在.NET的核心,我不得不使用:

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

    该方法包括转换到字符串,,,是:

    1
    2
    3
    4
    5
    6
    7
    public string FormatTo2Dp(decimal myNumber)
    {
        // Use schoolboy rounding, not bankers.
        myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);

        return string.Format("{0:0.00}", myNumber);
    }

    http:///EN一美元/图书馆/ dwhawy9k %=% 29.aspx vs.110 28V的

    这个链接的详细explains如何你可以把你的问题是什么,你可以,如果你想了解的更多。你想要的是简单的目的,是对的

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

    如果你想这是货币,你可以使它更容易通过打字"C2"而不是"F2"