将float.MaxValue转换为Long抛出异常?

Lal*_*lit 3 .net c#

试图获取float.MaxValue的整数部分,但它抛出错误?

        long l = Convert.ToInt64(float.MaxValue);
        Console.WriteLine(l);
Run Code Online (Sandbox Code Playgroud)

错误:算术运算导致溢出.

Ani*_*Ani 6

虽然a float是比long(8字节)更小的(4字节)结构,但它确实具有更宽的范围.(编辑:为了回应"为什么",您可能想要阅读每个计算机科学家应该知道的关于浮点运算的内容.与大多数积分类型不同,它们的范围不等于2 ^ Bits.)

float.MaxValue ~= 3.402823+e38
long.MaxValue ~= 9.223372+e18
Run Code Online (Sandbox Code Playgroud)

显然,不可分割的一部分float.MaxValue不能表示为long.(更别提这样一个事实,即用如此大的单精度浮点数来求这种精度通常是完全没有意义的).

现在,你可以尝试使用System.Numerics.BigInteger这里(使用适当的构造函数),如果你真的想用一个整数类型表示它,但没有进一步的信息我会严重怀疑你真的需要这么大的数字的整数运算.

如果您只需要以定点表示法显示数字,则可以使用适当的格式说明符:

//output: "340282300000000000000000000000000000000"
Console.WriteLine(float.MaxValue.ToString("F0"));
Run Code Online (Sandbox Code Playgroud)


Cod*_*ray 6

a的最大值float为3.4E + 38,而a的最大值long为9.2E + 18.因此,float.MaxValue不适合long.

当您指定大于或小于的值时,该Convert.ToInt64方法抛出一个OverflowExceptionInt64.MaxValueInt64.MinValue

如果您只想获取整数值float.MaxValue,请参阅此问题的相关答案.但请注意,即使剥离了浮点,a的最大值float仍然不适合long数据类型.

编辑: a float(32位值)具有比a long(64位值)更高的最大值的原因是由于计算机在内部表示浮点数的方式.浮点值类型可以包含比定点和整数类型更宽的值范围,尽管这个更大的范围是以牺牲精度为代价的.