【问题标题】:Formatting a .NET decimal value is different depending on how it was created [duplicate].NET 十进制值的格式因创建方式而异[重复]
【发布时间】:2017-10-17 16:38:40
【问题描述】:

看看下面的 C# 代码:

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

value1value2 之间有什么区别导致它们的格式不同(不同的小数位数)?

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

【问题讨论】:

  • 十进制有点特殊,它能够跟踪值中的有效位数。非常不同于浮点数和双精度数。因此,如果您没有指定分数中所需的位数,那么它将显示尽可能多的数字。
  • “我希望它们的格式相同” 您希望采用哪种方式?您希望它为第一个值添加有效数字还是从第二个值中删除它们?
  • @DStanley 如果两个值相等,我希望它们的行为相同。我真的不在乎它们是如何格式化的,只要它们是一致的。这只是出乎意料;感觉就像我无法知道十进制值将如何格式化,直到我真正做到这一点。如果由我决定,我会让默认格式的工作方式与浮点类型相同 - 删除所有不重要的零。

标签: c# .net formatting numbers decimal


【解决方案1】:

在内部,小数被存储为一种浮点数,因此它存储尾数和指数。在您的情况下,这两个数字的存储方式不同,大致如下:

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

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

当输出时,看起来 .NET 为您提供了根据指数定位的带有小数点的“完整”尾数。

【讨论】:

  • 是否有可能以某种方式获得尾数值和指数值?我的问题是这些值是两个不同的事物,每个事物的行为都不同,我应该能够检测到它们并不相同。如果value1 以某种方式表现而value2 以某种方式表现,那么它们对我来说不是相等的值。
  • 在数学上,1234 和 1234.00 是相等的。数据类型是表示数字的抽象,数字是相等的。如果您关心确定内存中值的底层表示是否相同,那么对于大多数使用十进制数据类型的人来说,您走的是不同的道路。所以我认为没有一个简单的操作员可以对此进行测试。但是,您可以深入研究该值的内部表示 - 在此处查看此答案 stackoverflow.com/a/3801462/22194
  • 或者如果你使用float,我认为它是规范化的,这意味着内部是经过管理的,因此 1234 和 1234.00 将以相同的方式存储。
【解决方案2】:

您所做的方式在您的十进制值中添加了不同的精度。

值相同但格式不同

这里报告了一个类似的主题:Adjusting decimal precision, .net

【讨论】:

  • 谢谢,我知道它一定在 Stack Overflow 上的某个地方,但我就是找不到。此外,this answer 是一个有趣的解决方案。
  • 不客气
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多