可能重复:
.Net 浮点到双转换
我虽然我理解浮点但有人可以解释以下内容
float f = 1.85847987E+9F;
double d = Convert.ToDouble(f);
d 现在转换为字符串 as 1858479872.0
。我假设额外的 2 是因为 double 不能准确地表示浮点数。
我的问题是为什么直接分配时它似乎能够重新代表相同的号码
double d = 1.85847987E+9;
它完全显示为185847987.0
可能重复:
.Net 浮点到双转换
我虽然我理解浮点但有人可以解释以下内容
float f = 1.85847987E+9F;
double d = Convert.ToDouble(f);
d 现在转换为字符串 as 1858479872.0
。我假设额外的 2 是因为 double 不能准确地表示浮点数。
我的问题是为什么直接分配时它似乎能够重新代表相同的号码
double d = 1.85847987E+9;
它完全显示为185847987.0
因为浮点数存在于符号、尾数和指数之外。请参阅Jon Skeet 在此处的回答如何提取这些值。
因为1.85847987E+9F
,尾数为7259687
,指数为8
。然后mantissa << exponent
等于1858479872
。由于浮点数的精度限制为 7 位,因此任何超过 7 位的数字的值取决于实现,而不是输入。您可以通过输入123456789F
.
问题不是双重的,而是浮动的。浮点数限制为 32 位,而双精度使用 64 位。