浮点转换 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
显示
因为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
来轻松测试这一点。