C# double 到浮点数转换问题

C# double to float conversion issue

提问人:kenshieva 提问时间:8/3/2022 最后编辑:kenshieva 更新时间:8/3/2022 访问量:176

问:

感谢您阅读本文。

c# 中的浮点数范围为 +- 3.4 * 10^38,双精度 1.7 ^308 请考虑以下程序:

using System;

double nice;
float wow;
nice = 1.50* Math.Pow(10,300);
wow = (float) (nice);

Console.WriteLine(nice);
Console.WriteLine(wow);

output: 
1,5E+300
8

这让我真的很困惑,这么大的数字怎么能换算成 8 作为浮点数? 当我们将双精度转换为浮点数时,浮点数的尾数长度为 23 位,指数为 8 位 双 52 位和 11. 因此,当我从 double 显式转换为 float 并且数字那么大时,这意味着浮点数的指数部分只有 8 位,因此会溢出。其他 3 位是否只是在如此大的数字的情况下“滑落”或会发生什么?

此外,当我对 (int) 做同样的事情时,它也会给我一个非常奇怪的响应。

谁能解释一下为什么这是我得到的响应,以及当双精度的指数部分太大而无法放入浮点数之一时发生?

C# 数学 强制转换 精度

评论

3赞 Jay Buckman 8/3/2022
的值为 。 生产。我怀疑正在尽力而为......wowInfinitywow.ToString()Console.WriteLine()
1赞 Markus Safar 8/3/2022
这回答了你的问题吗?为什么在 Windows 10 控制台中将无穷大打印为“8”?

答:

2赞 StriplingWarrior 8/3/2022 #1

它不会转换为 (八)。它被转换为无穷大,其表示 () 看起来像一个横向的 8。无论您在何种环境中查看输出,都可能显示此内容,就像由于字体或区域性设置一样。88

具体来说,它是 PositiveInfinity,其文档澄清了:

当操作的结果大于 时,将返回此常量。MaxValue