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

wow*_*ows 610 .net c# decimal rounding

当显示当前小数的值时.ToString(),它精确到15个小数位,并且由于我用它来表示美元和美分,我只希望输出为2位小数.

我是否使用此变体.ToString()

alb*_*ein 857

decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
Run Code Online (Sandbox Code Playgroud)

要么

decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0
Run Code Online (Sandbox Code Playgroud)

  • 然后你可以做decimalVar.ToString("0.##").您还可以使用0.00作为格式字符串. (163认同)
  • 使用此解决方案,您将无法获得在阅读数字时所期望的文化格式.为此,您应该使用ToString("N2")或ToString("N"). (48认同)
  • 这里的问题是我们有0.00; 它返回一个空字符串. (30认同)
  • 这轮到最近,对吗?截断怎么样? (4认同)
  • @Hill`Decimal`和`Double`类型`ToString`方法接受格式化参数.尝试首先将您的值转换为十进制/双倍. (2认同)
  • @f470071 小数是值类型,因此永远不会“修改”。无论如何,从未期望 ToString() 修改它所调用的任何内容。 (2认同)

Mik*_* M. 568

我知道这是一个古老的问题,但我很惊讶地看到似乎没有人发布一个答案;

  1. 没有使用银行家四舍五入
  2. 没有将值保留为小数.

这是我会用的:

decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)

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

  • 关于银行家的四舍五入:http://www.xbeat.net/vbspeed/i_BankersRounding.htm (31认同)
  • @MatthijsWessels 我知道......但它也不会将值保留为小数。 (4认同)
  • ToString或string.Format不使用银行家四舍五入:http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#sectionToggle1 (3认同)

Sof*_*fox 330

decimalVar.ToString("F");
Run Code Online (Sandbox Code Playgroud)

这将:

  • 舍入到小数点后2位,例如.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(感谢Jon Schneider)

  • 有关"F"在何处及其工作原理的文档:http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (14认同)
  • 只有1位小数时才能正常工作; .ToString("#.##")失败.这个答案要好得多 (10认同)
  • 为什么不.ToString("N")而不是"F"?我的理解是他们都会为这个问题的需要而努力,但是N也会用逗号来表示成千上万的数字. (4认同)
  • 注意:根据文化,`.` 可能会替换为 `,`。你应该传递 `CultureInfo.InvariantCulture` 作为禁用它的第二个参数。 (3认同)
  • 它不会绕23.456 => 23.46吗? (2认同)

Jor*_*ira 103

如果你只是需要这个用于显示使用string.Format

String.Format("{0:0.00}", 123.4567m);      // "123.46"
Run Code Online (Sandbox Code Playgroud)

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

"m"是十进制后缀.关于十进制后缀:

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

  • 技术上,对于小数,它将是123.4567m,是吗?如果没有"m"后缀,那就是双倍 (10认同)
  • 或快捷方式 $"{value:0.00}" (4认同)

Haf*_*hor 55

给定小数d = 12.345; 表达式d.ToString("C")String.Format("{0:C}",d)产生$ 12.35 - 请注意使用当前文化的货币设置,包括符号.

请注意,"C"使用当前文化中的位数.您始终可以覆盖默认值以强制使用C{Precision specifier}类似的必要精度String.Format("{0:C2}", 5.123d).

  • 如果你想要美元符号,只有正确的答案. (6认同)
  • @ Slick86 - 当前的标志 (4认同)

Joe*_*ler 48

如果你想用逗号和小数点(但没有货币符号)格式化,例如3,456,789.12 ......

decimalVar.ToString("n2");
Run Code Online (Sandbox Code Playgroud)

  • 更好的答案,因为问题是关于在页面上输出,并且数字格式对于大数字很重要。此外,“n*”考虑了当前的区域性,因此它可以是“3.456.789,12”、“3 456 789,12”等。 (3认同)

Sim*_*ver 28

已经有两个高得分的答案引用了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"
Run Code Online (Sandbox Code Playgroud)

执行相同的操作Double将不会"25"为上述每个操作提供小数位().

当你想要一个十进制到2位小数时,大概有95%的可能性,因为它是货币,在这种情况下,95%的情况下这可能是好的:

Decimal.Parse("25.0").ToString("c")     =>   "$25.00"
Run Code Online (Sandbox Code Playgroud)

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

我遇到一个案例,我需要一个十进制AS小数,这是在向亚马逊的Web服务发送XML时.该服务抱怨,因为Decimal值(最初来自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"
 }
Run Code Online (Sandbox Code Playgroud)

TypedValue是类型Decimal所以我不能做,ToString("N2")并需要围绕它并保持它作为一个decimal.

  • +1这是一个很好的答案.当你说System.Decimal"知道有多少小数位"时 - 术语是System.Decimal不是**自我规范化**,因为其他浮点类型是.System.Decimal的另一个有用属性是数学运算的结果总是具有来自输入参数的最小小数位数,即.*1.0m + 2.000m = 3.000m*.你可以使用这个事实强制一个没有小数位的小数到2位小数,只需将它乘以1.00m即可.*10米*1.00米= 10.00米*. (5认同)
  • MattDavey不正确,添加了小数精度.(1.0m*1.00m).ToString()="1.000" (2认同)
  • 知道"小数"知道根据它来自何处的小数位数是非常非常有用的.非常感谢! (2认同)

Wha*_*ool 21

这是一个显示不同格式的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("===================");
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

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
===================
Run Code Online (Sandbox Code Playgroud)


goa*_*amn 11

如果值为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"
Run Code Online (Sandbox Code Playgroud)

评分最高的答案是错误的,浪费了10分钟(大多数)人的时间.


Kai*_*ido 9

这些都不是我所需要的,强迫2 dp并向上舍入为0.005 -> 0.01

强制2 dp需要将精度提高2 dp,以确保我们至少有2 dp

然后四舍五入以确保我们没有超过2 dp

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

6.665m.ToString() -> "6.67"

6.6m.ToString() -> "6.60"
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 9

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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

一个示例单元测试:

[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"));
}
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用system.globalization格式化任何所需格式的数字.

例如:

system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");
Run Code Online (Sandbox Code Playgroud)

如果你有一个decimal d = 1.2300000,你需要将其修剪为2位小数,那么它可以像这样打印d.Tostring("F2",ci);,其中F2是字符串格式化为2位小数,ci是locale或cultureinfo.

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


小智 7

最适用的解决方案是

decimalVar.ToString("#.##");
Run Code Online (Sandbox Code Playgroud)


Hoc*_*eyJ 6

Mike M.的答案对我来说非常适合.NET,但.NET Core decimal.Round在撰写本文时没有一种方法.

在.NET Core中,我不得不使用:

decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)

hacky方法,包括转换为字符串,是:

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

    return string.Format("{0:0.00}", myNumber);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
Run Code Online (Sandbox Code Playgroud)

如果你想要一个货币,你可以通过输入“C2”而不是“F2”来让它更容易