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

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

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

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

要么

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

我知道这是一个古老的问题,但我很惊讶地发现,似乎没有人回答这个问题。

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

这是我会用的:

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

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

 decimalVar.ToString("F"); 

这会:

四舍五入到小数点后两位。 23.456 => 23.46

确保总是有2个小数位,例如。 23 => 23.00,12.5 => 12.50

货币和显示金额的理想select。

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

给定十进制d = 12.345; expression式d.ToString(“C”)String.Format(“{0:C}”,d)产生$ 12.35 – 注意使用包括符号的当前货币的货币设置。

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

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

 decimalVar.ToString("n2"); 

已经有两个得分高的答案,指的是Decimal.Round(…),但我认为需要多一点解释 – 因为Decimal有一个意想不到的重要属性,那就不明显。

小数点“知道”它有多less个小数位,它来自哪里。

例如以下可能是意想不到的:

 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" )。

当你想要一个小数到小数点后两位时,大约有95%的几率是因为它是货币,在这种情况下,95%

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

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

我遇到了一个例子,在将XML发送到Amazon的web服务时,我需要十进制的十进制数。 该服务正在抱怨,因为十进制值(最初来自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" } 

TypedValueDecimaltypes的,所以我不能只是做ToString("N2")并且需要将它舍入并保留为decimal

这里有一个小的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 =================== 

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

这些都没有做到我所需要的,迫使2dp0.005 -> 0.01

强制2点需要提高精度2点,以确保至less有2点的伤害

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

 Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero) 6.665m.ToString() -> "6.67" 6.6m.ToString() -> "6.60" 

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

例如:

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

如果你有一个decimal d = 1.2300000 ,你需要修剪到2个小数位然后它可以这样打印d.Tostring("F2",ci); 其中F2是string格式化为2位小数,而ci是语言环境或文化信息。

欲了解更多信息请点击此链接
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

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

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

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

如果你想要这个货币,你可以通过input“C2”而不是“F2”

Mike M.对.NET 的回答是完美的,但.NET Core在编写本文时没有使用decimal.Round方法。

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

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

一个黑客的方法,包括转换为string,是:

 public string FormatTo2Dp(decimal myNumber) { // Use schoolboy rounding, not bankers. myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero); return string.Format("{0:0.00}", myNumber); } 

如果值为0,则很less需要空string。

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

评分最高的答案描述了一种格式化十进制值的string表示的方法,它的工作原理。

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

 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; } } 

一个unit testing的例子:

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