浮点转换 c#

本文关键字:转换 | 更新日期: 2023-09-27 17:55:29

可能的重复项:
.净浮存金到双倍转换

我虽然我理解浮点数,但有人可以解释以下内容吗

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

d 现在转换为字符串,如 1858479872.0 。我假设额外的 2 是因为双精度不能准确地表示浮点数。

我的问题是为什么直接分配时似乎能够重新发送相同的数字

double d = 1.85847987E+9;

并且完全按照185847987.0显示

浮点转换 c#

因为double可以,而float不能精确地表示1.85847987E+9

为什么编译器不抱怨"float f = 1.85847987E+9F;",如果它不能正确表示它

根据 C# 规范,第 4.1.6 节浮点类型

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

问题不在于双重,而在于浮动。浮点数限制为 32 位,而双精度使用 64 位来表示精度。

因为浮点数存在于符号、尾数和指数之外。在此处查看 Jon Skeet 的答案,了解如何提取这些值。

对于1.85847987E+9F,尾数是7259687,指数是8。那么mantissa << exponent等于1858479872.由于浮点数的精度限制为 7 位,因此超过 7 位的任何数字的值取决于实现,而不是输入。您可以通过输入 123456789F 来轻松测试这一点。