尝试获取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
的整数值,请参阅此问题的相关答案。但请注意,即使去掉了浮点数,float
的最大值仍然无法适应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"));
float.MaxValue
的整数部分> long.MaxValue
,因此即使您截断小数点,也无法将其放入。 - BoltClock还要注意,从浮点类型到长整型没有隐式转换。