c# - .net 十进制值 1m 和 1.0000m 之间有什么实际区别吗?

标签 c# .net decimal

.net 十进制值 1m 和 1.0000m 之间有什么实际区别吗?

内部存储不同:

1m      : 0x00000001 0x00000000 0x00000000 0x00000000
1.0000m : 0x000186a0 0x00000000 0x00000000 0x00050000

但是,是否存在 BCL 中的方法会使用“有效数字”知识的情况?

我问是因为我正在研究一种压缩磁盘存储或网络传输的十进制值所需空间的方法,并且正在考虑在存储它之前“规范化”该值以提高其可压缩性的想法。但是,我想知道它是否可能导致问题。我猜它应该没问题,但这只是因为我没有看到任何公开值精度的方法或属性。有谁知道吗?

最佳答案

编码不同的原因是因为 Decimal 数据类型将数字存储为整数(96 位整数),具有用于形成除数以获得小数的小数位。该值本质上是

integer / 10^scale

Decimal 类型在内部表示为 4 Int32,请参阅 Decimal.GetBits 的文档了解更多详情。总之,GetBits 返回一个包含 4 个 Int32 的数组,其中每个元素代表 Decimal 编码的后续部分

Element 0,1,2 - Represent the low, middle and high 32 bits on the 96 bit integer
Element 3     - Bits 0-15 Unused
                Bits 16-23 exponent which is the power of 10 to divide the integer by
                Bits 24-30 Unused 
                Bit 31 the sign where 0 is positive and 1 is negative

所以在你的例子中,非常简单地说,当 1.0000m 被编码为十进制时,实际表示是 10000/10^4 而 1m 被表示为 1/10^0 在数学上相同的值只是编码不同。

如果您对十进制类型使用 native .NET 运算符并且不自己操作/比较位/字节,那么您应该是安全的。

您还会注意到,字符串转换也会考虑此二进制表示并生成不同的字符串,因此如果您依赖字符串表示,在这种情况下需要小心。

关于c# - .net 十进制值 1m 和 1.0000m 之间有什么实际区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33128535/

相关文章:

c# - 如何在为 WPF 调度程序事件提供服务时等待 WaitHandle?

python - 十进制模块中的有效数字

c# - 验证文化中的十进制数字

c# - "in"运算符和简单值传递 c# 之间的区别

c# - 类型约束

c# - Protobuf-net IsPacked=true 对于用户定义的结构

c# - 如何在 C# 中从 System.Array 转换为 object[]

sql - 如何在postgresql中将位变化转换为数字

c# - Asp.NET MVC 客户端验证不起作用

c# - 如何使用 Xamarin 在 iOS 8 中制作表格单元格和分隔符全宽?