2013-01-22 76 views
0

可能重复:
.Net float to double conversion浮点转换C#

我,虽然我明白浮点但有人可以解释以下

float f = 1.85847987E+9F; 
double d = Convert.ToDouble(f); 

d现在转换成字符串为1858479872.0。我假设额外2是因为double不能完全表示浮点数。

我的问题是为什么它似乎能够rerepsent相同号码时直接分配

double d = 1.85847987E+9; 

,它正好显示为185847987.0

+2

或者因为单精度浮点数不能表示值。看看[这里](http://msdn.microsoft.com/en-us/library/b1e65aza(v = VS.100).aspx)。 – HABO

+1

这里有很多关于这个的文章 - 有一个翻身。 – James

+2

Float可以存储7位有效数字,你有9位。转换为double不能奇迹般地恢复丢失的内容。 –

回答

1

因为double就可以了,float不能代表1.85847987E+9精确。

为什么编译器不会抱怨“float f = 1.85847987E + 9F;”如果它不能代表得当

按照C#说明书中,部分4.1.6浮点类型

浮点运算符,包括赋值运算符,从来不产生异常。

+0

然后真正的问题是:为什么编译器不会抱怨“float f = 1.85847987E + 9F;'”如果它不能正确表示它! –

+1

@NicolasRepiquet - 是否恰当?如果没有数据类型可以完全代表1/7,那么您只需选择一个不同的数字?该值在_float_的范围内,因此可以接受。 – HABO

+0

@Nicolas,这符合c#规范。它规定了特殊情况下的各种规则。对于高精度范围的非特殊情况,编译器只会降低精度,而不会产生任何异常。 – Tilak

0

问题不是双重的,而是浮动的。浮点数限制为32位,而双精度使用64位。

0

因为浮标存在于符号,尾数和指数之外。请参阅Jon Skeet's answer here如何提取这些值。对于1.85847987E+9F,尾数为7259687,指数为8。然后mantissa << exponent等于1858479872。由于float的精度为limited to 7 digits,超过7位的任何数字的值取决于实现,而不是输入。您可以通过输入123456789F来轻松测试。

+0

如果我有一个float开始,那么什么是转换为字符串'code'Convert.ToDouble(1.85847987E + 9F).ToString()或1.85847987E + 9F.ToString() – user2000579