C#Double - ToString()格式,带有两个小数位但没有舍入

kjv*_*kjv 145 c# string double

如何在C#中格式化Double为a String以便只有两个小数位?

如果我使用String.Format("{0:0.00}%", myDoubleValue)数字然后舍入,我想要一个没有任何舍入的简单截断.我也希望转换成String文化敏感.

Kyl*_*ndo 193

我使用以下内容:

double x = Math.Truncate(myDoubleValue * 100) / 100;
Run Code Online (Sandbox Code Playgroud)

例如:

如果该数字为50.947563并且您使用以下内容,则会发生以下情况:

- Math.Truncate(50.947563 * 100) / 100;
- Math.Truncate(5094.7563) / 100;
- 5094 / 100
- 50.94
Run Code Online (Sandbox Code Playgroud)

并且你的答案被截断了,现在要格式化字符串,只需执行以下操作:

string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
Run Code Online (Sandbox Code Playgroud)

  • 好吧没问题,我只想发一个附录. (3认同)
  • -1您可以在格式化字符串的相同`string.Format`步骤中执行区分大小写的格式.请参阅下面的答案. (2认同)
  • 那太棒了。我希望我的评论现在看起来不再那么愚蠢。:-) 那么我会改变我的反对票。 (2认同)
  • 不幸的是,当数字小于 1 时,您的解决方案不起作用,例如:0.97,这种情况有任何解决方法吗? (2认同)
  • @Jonny无法运行,因为它会四舍五入-OP希望将其截断(而不是四舍五入)。区别是微妙的。 (2认同)

Bri*_*den 95

以下几轮数字,但只显示最多2位小数(删除任何尾随零),谢谢.##.

decimal d0 = 24.154m;
decimal d1 = 24.155m;
decimal d2 = 24.1m;
decimal d3 = 24.0m;

d0.ToString("0.##");   //24.15
d1.ToString("0.##");   //24.16 (rounded up)
d2.ToString("0.##");   //24.1  
d3.ToString("0.##");   //24
Run Code Online (Sandbox Code Playgroud)

http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/

  • 这不起作用.试试0.2415999.这个解决方案是圆形的,而不是截断的. (9认同)
  • 哇,这么多的投票,但它正在使用四舍五入.可能有必要指出舍入是朝向所请求的最接近的小数位,而截断是在请求的最接近的小数位后切断. (4认同)
  • @mysticcoder 我想我的答案得到了很多赞成,因为他们以与我相同的方式在 Google 搜索中解决 ops 问题,希望删除尾随零,而不是寻找 ops 问题的舍入要求。我想我应该删除我的答案... (4认同)
  • @BrianOgden - 不,请不要删除。我来到这里寻找你的答案。+1 (4认同)

Ces*_*Gon 32

我建议先截断,然后格式化:

double a = 123.4567;
double aTruncated = Math.Truncate(a * 100) / 100;
CultureInfo ci = new CultureInfo("de-DE");
string s = string.Format(ci, "{0:0.00}%", aTruncated);
Run Code Online (Sandbox Code Playgroud)

使用常数100进行2位截断; 在您想要的小数点后使用1后跟尽可能多的零.使用您需要的文化名称来调整格式结果.

  • 我认为您应该使用静态属性 `Culture.InvariantCulture` 而不是 `new CultureInfo("de-DE")` (4认同)

Har*_*ter 15

最简单的方法,使用数字格式字符串:

double total = "43.257"
MessageBox.Show(total.ToString("F"));
Run Code Online (Sandbox Code Playgroud)

  • 其实这个方法确实圆 https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx#FFormatString (2认同)

CMS*_*CMS 11

price.ToString("0.00") 用来获得领先的0


小智 7

我在使用 Xamarin Forms 时遇到了这个问题,并用以下方法解决了它:

percent.ToString("0.##"+"%")
Run Code Online (Sandbox Code Playgroud)


max*_*axp 6

cyle函数,由Kyle Rozendo表示:

string DecimalPlaceNoRounding(double d, int decimalPlaces = 2)
{
    d = d * Math.Pow(10, decimalPlaces);
    d = Math.Truncate(d);
    d = d / Math.Pow(10, decimalPlaces);
    return string.Format("{0:N" + Math.Abs(decimalPlaces) + "}", d);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

添加一个额外的小数如何四舍五入然后丢弃:

var d = 0.241534545765;
var result1 = d.ToString("0.###%");

var result2 = result1.Remove(result1.Length - 1);
Run Code Online (Sandbox Code Playgroud)

  • 如果舍入影响超过截止值一位以上的数字,这将不起作用。例如,使用此代码,0.199999 将最终为 0.20,而不是 0.19。 (6认同)
  • 有趣的是,一个无效的答案有 60 个投票支持(截至今天),而这个非常简单且防弹的解决方案只有一个.... (4认同)