十进制类型 - 从字符串解析时向控制台显示的奇数行为,带有冗余零

本文关键字:冗余 显示 字符串 类型 控制台 十进制 | 更新日期: 2023-09-27 18:34:32

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

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?它似乎以某种方式坚持其字符串表示。这里有某种拳击吗?

比利·斯塔克

十进制类型 - 从字符串解析时向控制台显示的奇数行为,带有冗余零

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

一点也不奇怪。它被记录在案:

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

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

这是Jon Skeet链接的很好的解释,请参阅保持零

Decimal.Parse MSDN 页面上的脚注说:

小数点的小数结果。解析将具有相同数量的 有效数字作为从中解析的字符串。即"3.43" 和"3.4300"在解析为相同的数值时,导致 不同的十进制表示形式。这(在某种程度上(在 小数的二进制表示形式的说明。