浮点数范围怎么这么大,有 4 个字节 (±3.40282347E+38)

pre*_*etk 5 java floating-point int

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

\n\n

那么如何在两者具有相同的有限字节数的情况下表示恰好到where hasint的范围呢?-2,147,483,6482,147,483,647float\xc2\xb13.40282347E+38F

\n\n

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

\n

Fil*_*nti 7

“浮动”点意味着您的号码小数部分的位数可以更改,以在考虑到其大小所规定的限制的情况下“尽可能地”表示您的号码。

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

现在,让我们通过讨论有效数字指数来正式解释一下:

  • 有效数字包含您的有效数字
  • 指数表示 10 乘数的指数,或者,如果更简单的话,表示需要将小数点移动多少位(0 位于第一个有效数字之前)。

假设您的“浮点”数据类型的有效数最多可以有 4 位数字,指数最多可以有 1 位数字,并且有效数指数中都可以有减号。您将能够表示从-0.9 999 * 10^9 = -999900000到 的数字+0.999 9 * 10^9 = +999900000。正如您所看到的,虽然数字相当大,但您无法准确表示大多数大数字,因为您只有 4 位数字可用于表示。这种精度损失可以通过表示非常小的数字的能力来补偿,例如您可以表示0.999 9 * 10^-9 = 0.000 000 000 999 9

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


为了完善您对此事的了解,请将上述概念转化为二进制(通常float使用 4 位表示指数,23 位表示有效数,1 位表示有效数的符号)。

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

有关详细信息,请参阅以下链接: https://en.wikipedia.org/wiki/Floating-point_arithmetic#IEEE_754 :_floating_point_in_modern_computers

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

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

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");
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

会以违反直觉的方式输出something else,但如果您开始处理数字或将类型更改为浮动,它将产生正确的输出。

所以请注意:您需要完全理解这个概念。