44

可能重复:
当Java中的大小相同时,浮点数和整数数据类型有什么区别?

您可能知道,这两种类型都是 32 位的。int只能保存整数,同时float也支持浮点数(如类型名称所示)。

那么怎么可能最大值int是 2 31,最大值 float是 3.4*10 38,而它们都是 32 位呢?

我认为它int的最大值容量应该高于浮点数,因为它不会为浮点数节省内存并且只接受整数。在这种情况下,我会很高兴得到解释。

4

4 回答 4

60

您的直觉非常正确地告诉您,一个中的信息内容不能多于另一个,因为它们都有 32 位。但这并不意味着我们不能使用这些位来表示不同的值。

假设我发明了两种新的数据类型,uint4并且foo4. uint4使用 4 位来表示一个整数,在标准的二进制表示中,所以我们有

bits   value
0000       0
0001       1
0010       2
...
1111      15

foo4使用 4 位来表示这些值:

bits   value
0000       0
0001      42
0010     -97
0011       1
...
1110      pi
1111       e

尽管位数相同,但现在foo4具有比广泛的值范围!uint4如何?因为有些uint4不能用 来表示foo4,所以位映射中的那些“槽”可用于其他值。


int-float它们都可以存储一组 2 32 个值中的值,只是存储不同的 2 32 个值组。

于 2012-06-22T14:53:06.733 回答
15

浮点数可能存储更高的数值,但即使在小数点之前的数字上也不会精确。考虑以下示例:

float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a);  // 1.234568E+29

请注意,几乎没有保持任何精度。

另一方面,整数将始终精确地存储其值范围内的任何数字。

为了便于比较,我们来看一个双精度浮点数:

double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29

请注意,保留了大约两倍的有效数字。

于 2012-06-22T14:46:20.383 回答
6

这些基于 IEEE754 浮点规范,这就是它可能的原因。请阅读本文档。这不仅仅是关于多少位。

于 2012-06-22T14:46:16.320 回答
4

提示在“浮点”的“浮动”部分。你所说的基本上是假设固定点。浮点数不会为小数点后的数字“保留空间” - 它的位数有限(23 位二进制)并记住将其乘以的 2 的幂。

于 2012-06-22T14:51:28.517 回答