将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));