在计算技术发展的某个阶段,很明显中央处理单元需要硬件设备来处理浮点数。如今,所有计算机架构都可以有效地处理这些数字。当然,在编程语言中,也离不开相应的数据类型。Java中有两种浮点数据类型:float和double。Java Float关键字定义了一个在内存中占用 32 位的实数。我们将在本文中讨论这些数字。

浮点数字。实数在计算机中是如何存储的?

为了在计算机内存中存储实数,需要分配一定数量的位。实数存储为符号(加号或减号)、螳螂和指数。什么是尾数和指数最好用一个例子来解释。月球的质量大约为 7*1022。这里 7 是螳螂,22 是指数。当屏幕上显示较大的数字或反之亦然的非常小的数字时,您可以看到类似 7E22 的条目。这是浮点数,这里的 7 是螳螂,22 是 10 的指数或幂。这种表示法称为指数表示法。

Java float 关键字和 Java Double 关键字

Java 中的浮点值(浮点数或实数)由floatdouble类型表示。正是这些关键字用于存储小数点后直到某个符号的值。 double是具有双精度的数字,尽可能接近作为计算结果给出或获得的值。Java Double用于任何数学计算(平方根、正弦、余弦等),以及所有需要一定精度的计算。 float数据类型用于不太精确的浮点类型。为了节省内存,很少使用它。下面我们有一个表格,其中包含有关 float 和 double 的主要信息,以及它们的区别。
漂浮 双倍的
主要的 float 是一个单精度值 它是一个双精度值
默认尺寸 4 字节(32 位) 8 字节(64 位)
默认值 0.0f 0.0
范围 从 1.4e–045 到 3.4e+038 从 4.9e–324 到 1.8e+308
它是用来做什么的 为了节省内存 相对准确地处理小数
所以Float关键字的意思是一个数字,一个在内存中占用32位或4个字节的单精度值。在某些处理器上,处理此类数字的速度更快,并且如前所述,与双精度数字相比,它们占用的空间更少。但是,光靠速度是不可能说得清楚的。假设一些现代处理器可以更快地处理双精度数字。

Java 浮点数和双重声明

您可以使用与其他类型的数字相同的方式 声明double类型的数字:

double myDouble = 2.7;
但是,如果您以这种方式表示浮点数,编译器将要求您将数字类型更改为 double。这是浮点变量的错误示例:

public class FloatExample {
   public static void main(String[] args) {
//double and float variables 
       double myDouble = 2.7;
       float myFloat = 3.14;
   }
}
如果运行该程序,会发生以下情况:

Error:(4, 25) java: incompatible types: possible lossy conversion from double to float
事实上,使用浮点数是不可取的,这样做只是为了节省内存。Java中所有实小数默认都是Double ,该语言的语法也强调这一点。如果您确实想使用浮点类型,则需要使用 f 终止数字来显式指定它。

public class FloatExample {
   public static void main(String[] args) {
//double and float variables
       double myDouble = 2.7;
       float myFloat = 3.14f;
   }
}
顺便说一下,浮点数和双精度数可以写成指数形式。

float myFloat2 = 2E22f;
double myDouble2 = 3e10;
如果您在“正常”表示中使用足够大的数字,Java 将立即以指数形式显示它们。让我们举个例子:

public class FloatExample {
   public static void main(String[] args) {
//float variables
               float myFloatNumber1=2182818284590.45f;
               float myFloatNumber2=19822612787260.141592181f;
               System.out.println("myFloatNumber1 = " + myFloatNumber1);
               System.out.println("myFloatNumber2 = " + myFloatNumber2);
       System.out.println("myFloatNumber1 + myFloatNumber2 = " + myFloatNumber1 + myFloatNumber2);
           }
       }
该程序的工作结果如下:
myFloatNumber1 = 2.1828183E12 myFloatNumber2 = 1.98226121E13 myFloatNumber1 + myFloatNumber2 = 2.1828183E121.98226121E13

特殊浮点数和双精度数示例

Java语言中有3种特殊的浮点数,用于指示溢出和错误。他们来了:
  • 正无穷大是正数除以 0 的结果。由常量Double.POSITIVE_INFINITYFloat.POSITIVE_INFINITY表示。

  • 负无穷大是负数除以 0 的结果。由 Double.NEGATIVE_INFINITYFloat.NEGATIVE_INFINITY常量表示。

  • NaN(不是数字)表示0/0的计算或取负数的平方根。由常量Double.NaNFloat.NAN表示。

以下是使用这些特殊浮点数的示例:

public class FloatExample {
   public static void main(String[] args) {
       int myInt = 1;
       float zero = 0.0f;
       double negZero = -0.0;
       double negativeInfinity = Double.NEGATIVE_INFINITY;
       double positiveInfinity = Float.POSITIVE_INFINITY;

       System.out.println(myInt / zero);
       System.out.println(myInt / negZero);
       System.out.println(zero == negZero);
       System.out.println(negativeInfinity * 0);
       System.out.println(positiveInfinity+negativeInfinity);

   }
}
结果是:
Infinity -Infinity true NaN NaN

双精度足够吗?

事实上,尽管Double类型具有双精度,但使用浮点数(例如在金融计算中)并不是最好的主意,因为舍入误差是不可接受的。因此,尝试在屏幕上显示以下程序的输出。

public class FloatExample {
   public static void main(String[] args) {
       System.out. println( "2.0 - 1.1 = " + (2.0 - 1.1));
   }
}
您将得到以下结果:
2.0 - 1.1 = 0.8999999999999999
假设结果为 0.9 是合乎逻辑的。然而,此类错误非常常见,并且与数字的内部二进制表示形式相关。例如,我们无法将 ⅓ 的精确值表示为小数;当然,二进制系统也有类似的限制。如果任务需要消除舍入误差,Java 可以使用BigDecimal类来实现此目的。