【问题标题】:Round Double To Two Decimal Places [duplicate]将双精度舍入到两个小数位[重复]
【发布时间】:2010-08-30 16:42:48
【问题描述】:

可能重复:
c# - How do I round a decimal value to 2 decimal places (for output on a page)

将双精度数舍入到小数点后两位并将其固定为小数点后两位的最佳方法是什么?

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

我希望避免这样的事情,我必须将双精度转换为字符串,然后再转换回双精度,这似乎是一种不好的方法。

【问题讨论】:

  • 在小数点后两位为零时添加小数点是一种视觉/表示形式,double 本身并不关心。因此,您肯定需要将这些转换为字符串以进行显示。

标签: c# c#-4.0


【解决方案1】:
double someValue = 2.346;    
String.Format("{0:0.00}", someValue);

【讨论】:

【解决方案2】:

将值四舍五入到所需的精度,然后对其进行格式化。总是更喜欢包含中点舍入参数的 Math.Round 版本。此参数指定如何将中点值 (5) 作为最后一位处理。

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

Math.Round(2.025,2)==2.02

Math.Round(2.035,2)==2.04

改为使用 MidPoint.AwayFromZero 参数:

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()。
【解决方案3】:
double someValue = 2.346;    
string displayString = someValue.ToString("0.00");

请注意,double.ToString(因此 string.Format())使用远离零的中点四舍五入,因此 0.125 变为 0.13。这通常是显示所需的行为。这些字符串显然不应该用于往返。

此方法也不适合数学计算中所需的舍入(其中 MidpointRounding.ToEven 通常是最好的方法)。在这种情况下,应该使用 Math.Round()。

【讨论】:

    【解决方案4】:

    看看Math.Round

    【讨论】:

    • Math.Round 不附加零。
    • @Robert - 你是在谈论展示吗?
    • @Robert - 见@Matt Greer 的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多