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

3

尝试获取float.MaxValue的整数部分但出现错误?

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

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

我只想要float.MaxValue的整数部分,可以是int32或int64。 - Lalit
1
感谢大家,我只是好奇浮点数如何比int32更大,因为它们都使用32位。 浮点数:32位,而int32:32位。 - Lalit
5个回答

6
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位值)更高的最大值,原因是计算机内部表示浮点数的方式。尽管这种更广泛的范围是以精度为代价实现的,但浮点值类型可以容纳更广泛的值范围。

6
尽管 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的整数部分,可以是int32或int64。 - Lalit
1
@Lalit:是的,但问题在于float.MaxValue的整数部分> long.MaxValue,因此即使您截断小数点,也无法将其放入。 - BoltClock
浮点数:32位,而长整型:64位。 - Lalit
有没有任何数据类型可以获取float.MaxValue的整数部分? - Lalit

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

0

2
这不重要,因为他不想进行隐式转换。这是与相应的最大值有关的问题。 - Femaref
哦,是MaxValues的问题,而不是转换的问题。 - arena-ru

0
你可以在 Int64 上使用 TryParse 方法。如果失败了,那么就使用以下方法获取浮点数的整数部分:
Int64.Parse(s.Substring(s.IndexOf(".") + 1));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接