我,虽然我明白浮点但有人可以解释以下
float f = 1.85847987E+9F;
double d = Convert.ToDouble(f);
d现在转换成字符串为1858479872.0
。我假设额外2是因为double不能完全表示浮点数。
我的问题是为什么它似乎能够rerepsent相同号码时直接分配
double d = 1.85847987E+9;
,它正好显示为185847987.0
我,虽然我明白浮点但有人可以解释以下
float f = 1.85847987E+9F;
double d = Convert.ToDouble(f);
d现在转换成字符串为1858479872.0
。我假设额外2是因为double不能完全表示浮点数。
我的问题是为什么它似乎能够rerepsent相同号码时直接分配
double d = 1.85847987E+9;
,它正好显示为185847987.0
问题不是双重的,而是浮动的。浮点数限制为32位,而双精度使用64位。
因为浮标存在于符号,尾数和指数之外。请参阅Jon Skeet's answer here如何提取这些值。对于1.85847987E+9F
,尾数为7259687
,指数为8
。然后mantissa << exponent
等于1858479872
。由于float的精度为limited to 7 digits,超过7位的任何数字的值取决于实现,而不是输入。您可以通过输入123456789F
来轻松测试。
如果我有一个float开始,那么什么是转换为字符串'code'Convert.ToDouble(1.85847987E + 9F).ToString()或1.85847987E + 9F.ToString() – user2000579
或者因为单精度浮点数不能表示值。看看[这里](http://msdn.microsoft.com/en-us/library/b1e65aza(v = VS.100).aspx)。 – HABO
这里有很多关于这个的文章 - 有一个翻身。 – James
Float可以存储7位有效数字,你有9位。转换为double不能奇迹般地恢复丢失的内容。 –