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