格式化.NET十进制值取决于它是如何创建

格式化.NET十进制值取决于它是如何创建

问题描述:

看看下面的C#代码是不同的:格式化.NET十进制值取决于它是如何创建

decimal value1 = 1234M; 
decimal value2 = 1234.00M; 
Console.WriteLine(value1 == value2); // True 
Console.WriteLine(value1);   // 1234 
Console.WriteLine(value2);   // 1234.00 

什么是导致他们以不同的格式value1value2之间的差异(不同小数位数)?

它们是相同的值,所以我希望它们的格式也一样。 value2是否以某种方式存储我创建它的地方有两位小数?如果是的话,我怎么能看到并改变它?

+2

小数的情况比较特殊,它能够在价值保持的显著的位数的轨道。非常不像float和double。所以如果你不指定你想要的分数有多少,那么它将显示尽可能多的数字,正如它所知道的那样。 –

+0

“我希望他们会以相同的方式格式化”您期望的方式是?你会期望它将第一个数值加上有效数字还是将它们从第二个数字中删除? –

+0

@DStanley如果两个值相等,我认为他们应该表现相同。我不在乎他们是如何格式化的,只要他们一致。这只是意想不到的;感觉就像我无法知道小数值如何格式化,直到我真正做到这一点。如果取决于我,我会使默认格式的工作方式与浮点类型相同 - 删除所有不重要的零。 –

内部小数点存储为浮点数类型,因此它存储尾数和指数。在你的情况下,两个号码存储不同的东西大致是:

decimal value1 = 1234M; 
// mantissa = 1234, exponent = 0 

decimal value2 = 1234.00M;  
// mantissa = 123400, exponent = 2 

输出时,它看起来像.NET让你得到“整体”尾数根据指数定位小数点。

+0

是否有可能以某种方式获得尾数值和指数值?我的问题是,这些价值是两个不同的事情,每个行为都有所不同,我应该能够检测到它们不相同。如果'value1'表现某种方式,'value2'表现出某种其他方式,那么它们对我来说就不是同等价值。 –

+0

数学上,1234和1234.00是相等的。数据类型是表示数字的抽象,并且数字是相等的。如果您关心的是确定内存中值的底层表示是否相同,那么对于使用小数数据类型的大多数人而言,您处于不同的路径。所以我不认为有一个简单的运营商可以测试。但是,您可以深入了解值的内部表示 - 请参阅此处的答案https://*.com/a/3801462/22194 – codeulike

+0

或者,如果您使用'float',我认为它是正常化的,这意味着内部管理所以1234和1234.00将以相同的方式存储。 – codeulike

你做的方式已经在你的小数值中增加了不同的精度。

这是相同的值,但不

类似的主题已经在这里报告了相同的格式:Adjusting decimal precision, .net

+0

谢谢你,我知道它必须在堆栈溢出的某个地方,我找不到它。此外,[这个答案](https://*.com/a/7983330/108374)是一个有趣的解决这个问题。 –

+0

不客气 –