在计算技术发展的某个阶段,很明显中央处理单元需要硬件设备来处理浮点数。如今,所有计算机架构都可以有效地处理这些数字。当然,在编程语言中,也离不开相应的数据类型。Java中有两种浮点数据类型:float和double。Java Float关键字定义了一个在内存中占用 32 位的实数。我们将在本文中讨论这些数字。
所以Float关键字的意思是一个数字,一个在内存中占用32位或4个字节的单精度值。在某些处理器上,处理此类数字的速度更快,并且如前所述,与双精度数字相比,它们占用的空间更少。但是,光靠速度是不可能说得清楚的。假设一些现代处理器可以更快地处理双精度数字。
浮点数字。实数在计算机中是如何存储的?
为了在计算机内存中存储实数,需要分配一定数量的位。实数存储为符号(加号或减号)、螳螂和指数。什么是尾数和指数最好用一个例子来解释。月球的质量大约为 7*1022。这里 7 是螳螂,22 是指数。当屏幕上显示较大的数字或反之亦然的非常小的数字时,您可以看到类似 7E22 的条目。这是浮点数,这里的 7 是螳螂,22 是 10 的指数或幂。这种表示法称为指数表示法。Java float 关键字和 Java Double 关键字
Java 中的浮点值(浮点数或实数)由float和double类型表示。正是这些关键字用于存储小数点后直到某个符号的值。 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 |
它是用来做什么的 | 为了节省内存 | 相对准确地处理小数 |
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_INFINITY和Float.POSITIVE_INFINITY表示。
-
负无穷大是负数除以 0 的结果。由 Double.NEGATIVE_INFINITY和Float.NEGATIVE_INFINITY常量表示。
-
NaN(不是数字)表示0/0的计算或取负数的平方根。由常量Double.NaN和Float.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类来实现此目的。
GO TO FULL VERSION