Java 4字节(±3.40282347E+38)的浮点范围有多大

Java 4字节(±3.40282347E+38)的浮点范围有多大,java,floating-point,int,Java,Floating Point,Int,在java中,int和float类型都是4字节 那么int如何表示从-2147483648到2147483647的范围,其中float大约有±3.40282347E+38F,而两者都有相同的有限字节数 根据我的理解,两者应该具有相同的范围,因为它们具有相同的字节数。有人能解释一下浮点如何表示这么大的范围吗?浮点意味着数字小数部分的位数可以改变,以尽可能最好地表示数字,因为它的大小受到限制 让我们暂时忘记浮点数据类型的4个字节,并假设您的浮点类型最多可以存储10位数字加上负号。 这意味着您可以准确

在java中,int和float类型都是4字节

那么int如何表示从-2147483648到2147483647的范围,其中float大约有±3.40282347E+38F,而两者都有相同的有限字节数


根据我的理解,两者应该具有相同的范围,因为它们具有相同的字节数。有人能解释一下浮点如何表示这么大的范围吗?

浮点意味着数字小数部分的位数可以改变,以尽可能最好地表示数字,因为它的大小受到限制

让我们暂时忘记浮点数据类型的4个字节,并假设您的浮点类型最多可以存储10位数字加上负号。 这意味着您可以准确地表示:-9 999到+9 999之间的数字。 但是,如果需要一个小数点,则可以准确地表示-999.9到+999.9之间的数字。正如您所看到的,范围实际上发生了变化

现在,让我们通过讨论有效位和指数来形式化解释:

有效位包含有效数字 指数表示10乘数的指数,或者,如果更简单的话,表示在第一个有效数字前0必须移动小数点的位置。 假设浮点数据类型的有效位最多为4位,指数最多为1位,加上有效位和指数中的减号。 您将能够表示-0.9999*10^9=-99900000到+0.9999*10^9=+99900000之间的数字。正如您所看到的,虽然数字非常大,但您无法准确地表示大多数大的数字,因为您只有4位数字可用于表示。这种精度损失可以通过表示非常小的数字来补偿,例如,可以表示0.999 9*10^-9=0.000 000 000 999 9

这解释了为什么范围如此之大,尽管大小只有4个字节,正如您在问题中所述

为了完成您对这一问题的了解,将上述概念转化为二进制。您典型的浮点运算使用4位表示指数,23位表示有效位,1位表示有效位符号

维基百科是一个很好的起点。通常,编程的主要目的是了解在给定数据类型和精度的情况下可以存储多少十进制数字,因为这将决定哪种特定的十进制格式最适合您的目的

有关详细信息,请参阅以下链接:

请注意,理解二进制浮点数的概念在信息技术中非常重要,因为即使是最简单的计算也会受到它的严重影响

例如,计算机二进制文件上表示的浮点是编写以下内容的原因:

public class MyClass {
    public static void main(String args[]) {
      double x=0.1f;
      double y=0.2f;
      double z=0.3f;

      if(x+y == z) {
          System.out.println("something");
      }
      else {
          System.out.println("something else");
      }
    }
}
将反直觉地输出其他内容,但如果您开始使用数字或将类型更改为float,则将生成正确的输出


因此,请注意:您需要完全理解这个概念。

了解。基本上,它并不代表Wikipedia中从-3*10^38到3*10^38的所有实数。在-3*10^38到3*10^38之间有无限多个实数,因此自然地,浮点类型只能代表其中的一小部分,而不管使用多少字节。由于它的范围比int类型大,这意味着float类型甚至不能表示该范围内的所有整数。也可能有帮助。缩放。基本上,二进制浮点数表示尾数x2^scale。其中尾数和刻度被压缩到32位浮点表示中。这意味着大约有2^32个不同的值,分布不均匀。请注意,您的代码示例是javascript,但问题是用java标记的。该死的,我的懒惰…:浮点数小数部分的首选术语是“有效位”。“尾数”是对数小数部分的旧术语。尾数是对数的,加上尾数将乘以表示的值,而有效位是线性的,根据指数刻度,加上有效位将给表示的值加上一些东西。是的。将修改答案。