[英]Can i store a UInt32, Int32 and a float value inside a double without losing information?
我需要在变量中保存UInt32,Int32和float值。 我可以使用double
而不会丢失信息(例如,在转换中丢失一些数字)或者我是否需要使用任意精度类?
从我目前的研究看起来我可以,因为我可以存储UInt32的最大值而不会丢失信息:
Assert.AreEqual(UInt32.MaxValue, Convert.ToUInt32(Convert.ToDouble(UInt32.MaxValue)));
我错过了什么吗?
能够在不丢失信息的情况下存储UInt32
的最大值并不一定意味着您将能够在不丢失信息的情况下将所有值存储在UInt32
- 毕竟,有很多long
值可以存储在double
即使一些较小的值不能。 (2 62可以很容易地存储在一个double
,但2 62 - 1不能,例如。)
但是, 也还行- 用于尾数double
是52位长 ,所以具有少于52位的任一整数可以平凡被存储为值* 2 0(即0的有效规模)。
是的, float
值可以转换为double
,也不会损失精度。
但是,请注意,这并不意味着0.1f == 0.1d
的例子-它只是意味着(double) 0.1f
是完全一样的号码作为0.1f
,在不同的表示。
同样值得注意的是Int32
范围不比UInt32
小 - 它们的范围恰好是2 32个连续值。 但是, Int32
确实具有较小的“绝对”值,并且符号以浮点值表示,这是相关的。 你仍然需要32位才能存储每个Int32
的绝对值,因为Int32.MinValue
是二进制的-10000 ... 0000(总共32位),或 - (2 31 + 1)。
最后, float
不仅仅是精度更低的double
- 它的范围也更小。 对于指数,它只有8位,而在double
只有11位。 因此,即使它们没有很多有效(二进制)数字,也有在double
范围内的数字,这些数字超出了float
的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.