【问题标题】:decimal type - odd behaviour displaying to the console with redundant zeros when parsing from a string十进制类型 - 从字符串解析时向控制台显示带有冗余零的奇怪行为
【发布时间】:2012-05-17 10:23:13
【问题描述】:

我们发现了一些奇怪的行为,小数点显示在控制台上。 下面的代码最好地描述了这一点:

string num1AsString = "1.0000";
decimal num1AsDecimal = decimal.Parse(num1AsString);

string num2AsString = "1";
decimal num2AsDecimal = decimal.Parse(num2AsString);

Console.WriteLine(num1AsDecimal);
Console.WriteLine(num2AsDecimal);

控制台的输出是:

1.0000
1

但是 num1AsDecimal 和 num2AsDecimal 在调试器中仅显示为 1。 num1AsDecimal 如何以某种方式保留 .0000?它似乎以某种方式坚持其字符串表示。这里有什么拳击吗?

比利·斯塔克

【问题讨论】:

    标签: c# decimal floating-accuracy


    【解决方案1】:

    我们发现了一些奇怪的行为,小数点显示在控制台上。

    一点也不奇怪。我是documented

    缩放因子还保留十进制数中的任何尾随零。尾随零不会影响算术或比较运算中的 Decimal 数的值。但是,如果应用了适当的格式字符串,则 ToString 方法可以显示尾随零。

    换句话说,这里有点奇怪的是调试器的行为,而不是ToString()。如果您在调试器中观看num1AsDecimal.ToString(),那也应该保留尾随零。

    【讨论】:

    • 感谢您的回答。在 c# 1 中,不会显示尾随零。我不明白为什么他们更改了小数默认显示格式行为。毕竟,如果需要,我们有办法轻松显示用所需小数位填充的小数。
    • @bstack:假设您知道要使用的小数位数。这是保留有关该值的更多信息 - 您应该认为有多少小数位是重要的。我相信做出改变是为了使其符合国际标准 - 大概是因为它很有用......
    【解决方案2】:

    这是 Jon Skeet link 的精彩解释,请参阅 Keeping zeros

    【讨论】:

      【解决方案3】:

      Decimal.ParseMSDN 页面上的脚注说:

      decimal.Parse 的十进制结果将具有相同数量的 有效数字作为解析它的字符串。即“3.43” 和 "3.4300" 解析为相同的数值时,会导致 不同的十进制表示。这(在某种程度上)占 十进制的二进制表示的描述。

      【讨论】: