.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/