为什么 float 和 int 具有如此不同的最大值,即使它们是相同的位数?

2022-09-01 00:27:06

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

您可能知道,这两种类型都是32位。只能包含整数,同时还支持浮点数(如类型名称所示)。intfloat

那么,最大值为231,最大值为3.4 * 10 38,而它们都是32位,这怎么可能呢?intfloat

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


答案 1

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

假设我发明了两个新的数据类型,和 。 使用4位来表示一个整数,在标准的二进制表示中,所以我们有uint4foo4uint4

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

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

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

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


对于 和 - 它们都可以存储一组 232 个值中的值,只是 232 个值的不同集合。intfloat


答案 2

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

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

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

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

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

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

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