尝试获取float.MaxValue的整数部分但是它抛出了错误?
long l = Convert.ToInt64(float.MaxValue);
Console.WriteLine(l);
错误: 算术运算导致溢出。
答案 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)
另请注意,没有从浮点类型到long的隐式转换。
答案 4 :(得分:0)
您可以在Int64上使用TryParse方法。如果它失败,那么只需使用:
取浮点的整数部分Int64.Parse(s.Substring(s.IndexOf(“。”)+ 1));