747

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

.ToString()是否为此使用了一个变体?

4

18 回答 18

1055
decimalVar.ToString("#.##"); // returns ".5" when decimalVar == 0.5m

或者

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

或者

decimalVar.ToString("0.00"); // returns "0.50"  when decimalVar == 0.5m
于 2008-10-02T22:43:02.617 回答
643

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

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

这就是我会使用的:

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

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

于 2011-04-20T01:16:08.007 回答
415
decimalVar.ToString("F");

这会:

  • 四舍五入到小数点后 2 位,例如。 23.45623.46
  • 确保始终有 2 位小数,例如。 2323.00; 12.512.50

显示货币的理想选择。

查看有关ToString("F")的文档(感谢 Jon Schneider)。

于 2009-12-15T14:29:47.167 回答
115

如果你只需要这个来显示使用 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

于 2008-10-02T22:43:37.110 回答
59

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

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

于 2008-10-02T22:58:37.697 回答
53

如果您希望它使用逗号和小数点(但没有货币符号)格式化,例如 3,456,789.12...

decimalVar.ToString("n2");
于 2009-04-21T23:20:35.723 回答
37

有一个非常重要的特征Decimal并不明显:

一个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% 的情况下可能都很好:

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

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

我遇到了一个需要小数的情况,因为小数是在将 XML 发送到亚马逊的网络服务时。该服务正在抱怨,因为 Decimal 值(最初来自 SQL Server)被发送为25.1200并被拒绝,(25.12是预期的格式)。

无论值的来源如何,我需要做的只是Decimal.Round(...)使用 2 个小数位来解决问题。

 // generated code by XSD.exe
 StandardPrice = new OverrideCurrencyAmount()
 {
       TypedValue = Decimal.Round(product.StandardPrice, 2),
       currency = "USD"
 }

TypedValue是类型Decimal,所以我不能只做ToString("N2"),需要将它四舍五入并将其保留为decimal.

于 2011-10-26T07:30:22.117 回答
22

这是一个显示不同格式的小 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
===================
于 2013-11-18T20:44:08.593 回答
15

Math.Round 方法(十进制,Int32)

于 2008-10-02T22:44:43.377 回答
13

Mike M.在 .NET 上的回答对我来说是完美的,但 .NET Core 在撰写本文时还没有decimal.Round方法。

在 .NET Core 中,我必须使用:

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

一个 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);
}
于 2016-10-14T19:53:44.177 回答
13

如果值为 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 分钟时间。

于 2017-08-01T01:51:52.193 回答
9

这些都没有完全满足我的需要,强制2 dp并四舍五入为0.005 -> 0.01

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

然后四舍五入以确保我们的 dp 不超过 2

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

6.665m.ToString() -> "6.67"

6.6m.ToString() -> "6.60"
于 2012-10-25T14:35:16.783 回答
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;
    }
}

一个示例单元测试:

[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"));
}
于 2017-08-24T15:18:18.513 回答
7

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

例如:

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

如果您有 adecimal d = 1.2300000并且需要将其修剪到小数点后 2 位,则可以像这样打印它d.Tostring("F2",ci);,其中 F2 是字符串格式为 2 位小数,ci 是语言环境或文化信息。

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

于 2011-08-23T00:15:19.753 回答
5

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

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

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

如果你想要这种货币,你可以通过输入“C2”而不是“F2”来简化它

于 2016-06-25T20:01:50.350 回答
3
Double Amount = 0;
string amount;
amount=string.Format("{0:F2}", Decimal.Parse(Amount.ToString()));
于 2019-08-20T06:54:00.997 回答
2

如果您只需要保留 2 个小数位(即切除所有其余的小数位):

decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14

如果您只需要保留 3 位小数:

decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147
于 2020-03-13T11:39:06.437 回答
0
        var arr = new List<int>() { -4, 3, -9, 0, 4, 1 };
        decimal result1 = arr.Where(p => p > 0).Count();
        var responseResult1 = result1 / arr.Count();
        decimal result2 = arr.Where(p => p < 0).Count();
        var responseResult2 = result2 / arr.Count();
        decimal result3 = arr.Where(p => p == 0).Count();
        var responseResult3 = result3 / arr.Count();
        Console.WriteLine(String.Format("{0:#,0.000}", responseResult1));
        Console.WriteLine(String.Format("{0:#,0.0000}", responseResult2));
        Console.WriteLine(String.Format("{0:#,0.00000}", responseResult3));

您可以根据需要放置任意数量的 0。

于 2022-02-13T21:08:42.883 回答