虽然我理解浮点数,但有人可以解释以下内容
float f = 1.85847987E+9F;
double d = Convert.ToDouble(f);
d现在转换为1858479872.0
字符串。我假设额外的2是因为double不能完全代表浮点数。
我的问题是为什么它似乎能够在直接分配时重新显示相同的数字
double d = 1.85847987E+9;
,它显示为185847987.0
答案 0 :(得分:1)
因为double
可以,而float
无法准确代表1.85847987E+9
。
为什么编译器不会抱怨“float f = 1.85847987E + 9F;”如果它无法正确表示
根据C#规范,第4.1.6节浮点类型
浮点运算符(包括赋值运算符)从不产生异常。
答案 1 :(得分:0)
问题不是双重而是漂浮。浮点数限制为32位,而双精度使用64位精度。
答案 2 :(得分:0)
因为浮点数存在于符号,尾数和指数之外。请参阅Jon Skeet's answer here如何提取这些值。
对于1.85847987E+9F
,尾数为7259687
,指数为8
。然后mantissa << exponent
等于1858479872
。由于float的精度为limited to 7 digits,因此超过7位的任何数字的值取决于实现,而不是输入。您可以通过输入123456789F
轻松测试。