代码之家  ›  专栏  ›  技术社区  ›  wows

如何将十进制值四舍五入为2位小数(用于在页面上输出)

  •  567
  • wows  · 技术社区  · 16 年前

    当显示当前具有 .ToString() 它精确到15位小数,因为我用它来表示美元和美分,所以我只希望输出为2位小数。

    我用的是变体吗 toSTRIN() 为了这个?

    15 回复  |  直到 6 年前
        1
  •  795
  •   Mickael Bergeron Néron    8 年前
    decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
    

    decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0
    
        2
  •  535
  •   wonea Ilya Smagin    13 年前

    我知道这是一个古老的问题,但我惊讶地发现,似乎没有人发表这样的答案;

    1. 没有使用银行家舍入
    2. 没有将值保留为十进制。

    这就是我要用的:

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

    http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx

        3
  •  298
  •   Hanno Ottens    6 年前
    decimalVar.ToString("F");
    

    这将:

    • 四舍五入到小数点后两位,例如23.456=>23.46
    • 确保那里 总是2位小数,例如23=>23.00,12.5=>12.50

    非常适合货币和显示货币金额。

    有关ToString(“F”)的文档: http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (感谢乔恩·施耐德)

        4
  •  97
  •   xdumaine    11 年前

    如果您只需要这个来显示,请使用string.format

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

    http://www.csharp-examples.net/string-format-double/

    “m”是一个十进制后缀。关于十进制后缀:

    http://msdn.microsoft.com/en-us/library/364x0z75.aspx

        5
  •  54
  •   Alexei Levenkov    11 年前

    鉴于 小数d=12.345; 表达式 DtoToScript(“C”) string.format(“0:c”,d) 产量 12.35美元 -请注意,使用当前区域性的货币设置(包括符号)。

    注意 "C" 使用当前区域性中的位数。您始终可以覆盖默认值以强制使用 C{Precision specifier} 喜欢 String.Format("{0:C2}", 5.123d) .

        6
  •  42
  •   Joel Mueller    15 年前

    如果您想用逗号和小数点(但没有货币符号)格式化它,例如3456789.12…

    decimalVar.ToString("n2");
    
        7
  •  27
  •   Simon_Weaver    13 年前

    已经有两个关于decimal.round(…)的高分答案了,但我认为需要更多的解释-因为decimal有一个意想不到的重要属性,这并不明显。

    一个小数“知道”它有多少个小数位是基于它来自哪里。

    例如,以下可能是意外的:

    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%的时间内是可以接受的:

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

    或者在XAML中,您只需使用 {Binding Price, StringFormat=c}

    我遇到的一个需要十进制的情况是,将XML发送到Amazon的WebService时。由于十进制值(最初来自SQL Server)被发送为 25.1200 被拒绝, 25.12 是预期的格式)。

    我要做的就是 Decimal.Round(...) 用2位小数来解决问题。

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

    TypedValue 属于类型 Decimal 所以我不能这么做 ToString("N2") 需要把它围起来 decimal .

        8
  •  20
  •   What Would Be Cool    9 年前

    下面是一个LinqPad程序,显示不同的格式:

    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("===================");
    }
    

    结果如下:

    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
    ===================
    
        9
  •  15
  •   John Smith    16 年前
        10
  •  9
  •   Alicia ibre5041    11 年前

    这些都不是我所需要的 2 D.P. 围拢为 0.005 -> 0.01

    强制2 d.p.需要将精度提高2 d.p.,以确保我们至少有2 d.p.。

    然后四舍五入,以确保我们没有超过2d.p.

    Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)
    
    6.665m.ToString() -> "6.67"
    
    6.6m.ToString() -> "6.60"
    
        11
  •  8
  •   Alex    7 年前

    评价最高的答案描述了一种格式化 字符串表示 小数点后的值,它就工作了。

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

    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"));
    }
    
        12
  •  7
  •   Alicia ibre5041    11 年前

    您可以使用System.Globalization以任何所需格式格式化数字。

    例如:

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

    如果你有 decimal d = 1.2300000 你需要把它修剪到小数点后两位,然后它就可以这样打印了 d.Tostring("F2",ci); 其中,f2是字符串格式,小数点后两位,ci是区域设置或文化信息。

    有关详细信息,请查看此链接
    http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

        13
  •  6
  •   goamn    7 年前

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

    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分钟的时间。

        14
  •  6
  •   Cody Gray    7 年前

    Mike M.'s answer 在.NET上非常适合我,但是.NET核心没有 decimal.Round 方法。

    在.NET核心中,我必须使用:

    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);
    }
    
        15
  •  4
  •   Vasfed SAJITHA MARIYAM    8 年前

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

    此链接详细说明了如何处理您的问题,以及如果您想了解更多信息,可以做什么。为了简单起见,您要做的是

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

    如果你想把它作为一种货币,你可以通过输入“c2”而不是“f2”来简化。