将双精度浮点数保留两位小数

29

可能重复的问题:
c# - 如何将 double 值保留两位小数并固定在两位小数?

最佳的方式是什么,可以将 double 值四舍五入到两位小数并使其固定在两位小数?

例如:2.346 -> 2.35, 2 -> 2.00

我希望避免像这样将 double 转换为字符串然后再转回 double 的方法,因为这似乎是一种不好的做法。


6
当两个小数位为零时,将它们相加仅仅是一种视觉/表示方式,double本身并不关心这一点。因此,你肯定需要将它们转换成字符串进行显示。 - Matt Greer
4个回答

49
double someValue = 2.346;    
String.Format("{0:0.00}", someValue);

5
这里不需要调用Math.Round。 - phoog
这个看起来更整洁:var aNumberAsString = $"{someValue:0.##}"; https://dev59.com/e1oU5IYBdhLWcg3wxY8l#37113694 - canbax

32

将值舍入到所需的精度,然后进行格式化。始终优先使用包含中间值(5)处理参数的Math.Round版本。此参数指定如何处理中间值。

如果未将AwayFromZero指定为param的值,则会获得默认行为ToEven。例如,使用ToEven作为舍入方法,您将获得:

Math.Round(2.025,2)==2.02

Math.Round(2.035,2)==2.04

相反,使用MidPoint.AwayFromZero param:

Math.Round(2.025,2,MidpointRounding.AwayFromZero)==2.03

Math.Round(2.035,2,MidpointRounding.AwayFromZero)==2.04

因此,对于正常的四舍五入,最好使用此代码:

var value=2.346;
var result = Math.Round(value, 2, MidpointRounding.AwayFromZero);
var str=String.Format("{0:0.00}", result );

不需要对值进行四舍五入。也不需要使用string.Format()。相反,您可以使用var value = 2.346; var str = value.ToString("0.00");。无论您是使用double.ToString()还是string.Format(),都将得到远离零点的中间值。因此,我应该重新表述第一句话:只有在需要MidpointRounding.ToEven时才应该使用Math.Round()。 - phoog

11
double someValue = 2.346;    
string displayString = someValue.ToString("0.00");

请注意,double.ToString(因此也包括string.Format())使用四舍五入的中间值规则,因此0.125变成了0.13。这通常是显示时所需的行为。显然,这些字符串不应用于往返航班。

对于需要进行数学计算的舍入(其中MidpointRounding.ToEven通常是最佳方法),该方法也不适用。在这种情况下,应使用Math.Round()。


5

Math.Round 不会添加零。 - Robert
@Robert - 你是在说显示方面的吗? - ChrisF
@Robert - 请参考@Matt Greer的评论。 - ChrisF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接