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

时间:2010-11-20 11:58:50

标签: c# .net

尝试获取float.MaxValue的整数部分但是它抛出了错误?

        long l = Convert.ToInt64(float.MaxValue);
        Console.WriteLine(l);

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

5 个答案:

答案 0 :(得分:6)

虽然float是一个比long(8字节)更小(4字节)的结构,但它确实有更宽的范围。 (编辑:为了回应“为什么”,您可能想要阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。与大多数积分类型不同,它们的范围不等于2 ^位。)

float.MaxValue ~= 3.402823+e38
long.MaxValue ~= 9.223372+e18

显然,float.MaxValue的组成部分不能表示为long。 (不要紧的是,用如此大的单精度浮点数来求这种精度通常是毫无意义的。)

现在,您可以尝试在System.Numerics.BigInteger使用appropriate constructor),如果您真的想用整数类型来表示它,但如果没有进一步的信息,我会严重怀疑您有真正的需要具有如此大数的整数运算。

如果您只需要以定点表示法显示数字,则可以使用相应的format-specifier

//output: "340282300000000000000000000000000000000"
Console.WriteLine(float.MaxValue.ToString("F0"));

答案 1 :(得分:6)

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

当您指定的值大于OverflowException或小于Int64.MaxValue时,Convert.ToInt64方法会引发Int64.MinValue

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

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

答案 2 :(得分:3)

在.Net 4中,有一种新的BigInteger类型可以处理这个数量的大小。

答案 3 :(得分:0)

MSDN about float conversion

  

另请注意,没有从浮点类型到long的隐式转换。

答案 4 :(得分:0)

您可以在Int64上使用TryParse方法。如果它失败,那么只需使用:

取浮点的整数部分

Int64.Parse(s.Substring(s.IndexOf(“。”)+ 1));