我有一个号码:94,800,620,800
Float是4字节数据类型。 Int32也是4字节数据类型。
float f = 94800620800; // ok
Int32 t = 94800620800; // error
请解释这个问题。为什么我在使用Int32时出错。为什么我可以将此数字用于float数据类型,因为它们都是4字节数据类型。感谢。
答案 0 :(得分:6)
因为您尝试分配的数字大于Int32
的数字Single
,恰好是2,147,483,647。需要注意的是,{{1}}的最大值为largest possible value。
答案 1 :(得分:5)
Int32的最大值为2,147,483,647 - 小于94,800,620,800。
浮点数可以取以下范围内的值:±1.5×10-45到±3.4×1038
另外,请查看此SO问题 - what the difference between the float and integer data type when the size is same in java?。这是一个Java问题,但概念是相同的,并且有差异的详细解释,即使它们的大小相同。
答案 2 :(得分:3)
因为该数字对于4字节int来说太大了。像Int32
这样的标量值有一个最小和最大限制(分别为-2 31 和2 31 - 在这种情况下为1),你只需要不要存储超出此范围的值。
浮点数的存储方式完全不同,因此您不会在运行期间获得具有巨大值的编译器错误,只会出现可能的精度问题。
答案 3 :(得分:3)
由于这些类型的内部表示。
float
使用类似i,d ^ n的东西,其中i是整数部分,d是小数部分,n是指数(当然,这发生在基数2中)。
通过这种方式,您可以在float
中存储更大的数字,但在存储整数时,它不会像Int32
那样准确。如果您尝试转换
float f = 94800620800;
为足以存储其值的整数类型,它可能与初始94800620800不同。
答案 4 :(得分:1)
也许您应该阅读错误消息? ;)
Error Integral constant is too large
32位int的最大值为2,147,483,647
另一方面,浮点数是有效的,因为它存储尾数和指数,而不是一个数字,所以它可以应对更大的范围,但可能会损失精度尝试打印浮动内容,因为低位丢失,您将获得94800620000
而不是94800620800
答案 5 :(得分:1)
整数类型是精确表示,而浮点数是有效数字和指数的组合。
floating point wiki page正在解释这是如何运作的。
答案 6 :(得分:0)
Int32的最大值为2,147,483,647。你的价值要高得多。
答案 7 :(得分:0)
常量表达式的提供值不在int数据类型的范围内。
答案 8 :(得分:0)
Int32的范围从 - 2,147,483,648到2,147,483,647。你的变量超出了范围。