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:假设您知道要使用的小数位数。这就保存了更多关于这个值的信息——你应该考虑多少小数点的重要性。我相信这一改变是为了使它符合国际标准——而且可能是因为它是有用的。。。