将float.MaxValue转换为Long抛出exception?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

关于浮点转换的MSDN

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

您可以在Int64上使用TryParse方法。 如果它失败,那么只需使用浮点数的整数部分:

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