【问题标题】:Double 2 Decimal Places [duplicate]双2小数位[重复]
【发布时间】:2011-08-26 15:44:59
【问题描述】:

可能重复:
How to round and format a decimal correctly?

我有这个:

double xValue = 0.0;
double yValue = 0.0;

foreach (var line in someList)
{
    xValue = Math.Round(Convert.ToDouble(xDisplacement - xOrigin), 2);
    yValue= Math.Round(Convert.ToDouble(yDisplacement + yOrigin), 2);

    sw.WriteLine("( {0}, {1} )", xValue, yValue);

}

当它进行该数学运算时,假设四舍五入到小数点后 2 位。

但是

..当一个数字类似于 6.397 时,它会将其四舍五入到 6.4 并且不包括尾随的 "0"

如何在数字末尾添加“0”

如果我将它添加到 BEFORE(除非有更好的方法吗?)上面的 foreach 循环...:

string properX = xValue.ToString().Replace(".", "");
string properY = yValue.ToString().Replace(".", "");

我该怎么做呢?

【问题讨论】:

  • 与您的问题无关,但是您真的想要xDisplacement - xOrigin 吗?我不知道您的应用程序做了什么,但通常从原点减去位移,而不是相反。
  • @Daniel:哈哈,我知道这有点令人困惑。但我实际上正在想出一些不同的东西..这只是一个普遍的问题:P

标签: c# math decimal rounding


【解决方案1】:

使用格式字符串:

sw.WriteLine("( {0:0.00}, {1:0.00} )", xValue, yValue);

有关文档,请查看 Standard Numeric Format StringsString.FormatTextWriter.WriteLine 公开相同的格式选项。

【讨论】:

  • 硬编码的小数点可能会导致 L10N 出现问题
  • @Stuart Dunkeld:不!这不是 . 说明符在格式字符串中的工作方式。 String.Format 会考虑本地化设置,以便使用适当的符号。参看。 msdn.microsoft.com/en-us/library/0c899ak8.aspx#SpecifierPt 声明““.”自定义格式说明符将本地化的小数分隔符插入到结果字符串中。”和“在结果字符串中用作小数分隔符的字符并不总是句点;它由控制格式的NumberFormatInfo 对象的NumberDecimalSeparator 属性确定。”
【解决方案2】:

此链接中的第一组示例:

http://www.csharp-examples.net/string-format-double/

// just two decimal places
String.Format("{0:0.00}", 123.4567);      // "123.46"
String.Format("{0:0.00}", 123.4);         // "123.40"
String.Format("{0:0.00}", 123.0);         // "123.00"

应该是你要找的。它还详细说明了很多。

关于字符串数字格式的 MSDN 文档:

http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SpecifierPt

【讨论】:

  • 抱歉,但这允许继续使用. 不支持本地化的神话。请注意,The "." Custom Specifier 的文档指出:“在结果字符串中用作小数分隔符的字符并不总是句点;它由控制格式的NumberFormatInfo 对象的NumberDecimalSeparator 属性确定。”
  • @Jason 很公平,我不确定它是否支持本地化,因此我仔细选择了我的话并说“你可能需要”。但我还是把它删除了,并提供了你提到的 MSDN 文档的链接。
  • 很公平。这是一个常见的神话,即使你的陈述并不坚定,我也不得不发表评论。
【解决方案3】:

这个尾随的零与数字本身无关,而是与它的表示有关。所以如果你想显示它,没有什么可以改变数字 - 使用字符串格式:

sw.WriteLine("( {0:0.00}, {1:0.00} )", xValue, yValue);

【讨论】:

    【解决方案4】:

    使用numeric format string 显示任意多的小数位:

    sw.WriteLine("( {0:N2}, {1:N2} )", xValue, yValue);
    

    【讨论】:

      【解决方案5】:

      您可以将舍入作为输出格式的一部分,而不是对值进行舍入(您可能不想这样做):

      WriteLine("{0:0.00}", value)
      

      【讨论】:

        猜你喜欢
        • 2013-06-09
        • 2018-07-02
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多