Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# decimal type-当从字符串解析时,控制台显示的奇数行为带有冗余零_C#_Decimal_Floating Accuracy - Fatal编程技术网

C# decimal type-当从字符串解析时,控制台显示的奇数行为带有冗余零

C# decimal type-当从字符串解析时,控制台显示的奇数行为带有冗余零,c#,decimal,floating-accuracy,C#,Decimal,Floating Accuracy,我们发现一些奇怪的行为,小数显示在控制台上。 以下代码最能说明这一点: string num1AsString = "1.0000"; decimal num1AsDecimal = decimal.Parse(num1AsString); string num2AsString = "1"; decimal num2AsDecimal = decimal.Parse(num2AsString); Console.WriteLine(num1AsDecimal); Console.Write

我们发现一些奇怪的行为,小数显示在控制台上。 以下代码最能说明这一点:

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的?它似乎在某种程度上保留了它的字符串表示形式。这里有什么拳击比赛吗


比利·斯塔克(Billy Stack)

这是乔恩·斯凯特(Jon Skeet)的精彩解释,请参见保持零这是乔恩·斯凯特(Jon Skeet)的精彩解释,请参见保持零

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

一点也不奇怪。它是:

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

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

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

一点也不奇怪。它是:

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

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

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

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

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

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

谢谢你的回答。在c#1中,尾随的零不会显示。我不明白他们为什么更改了小数的默认显示格式行为。毕竟,如果需要的话,我们有办法轻松地显示带有所需小数位数的小数。@bstack:假设您知道要使用的小数位数。这就保存了更多关于这个值的信息——你应该考虑多少小数点的重要性。我相信这一改变是为了使它符合国际标准——而且可能是因为它很有用……谢谢你的回答。在c#1中,尾随的零不会显示。我不明白他们为什么更改了小数的默认显示格式行为。毕竟,如果需要的话,我们有办法轻松地显示带有所需小数位数的小数。@bstack:假设您知道要使用的小数位数。这就保存了更多关于这个值的信息——你应该考虑多少小数点的重要性。我相信这一改变是为了使它符合国际标准——而且可能是因为它是有用的。。。