在Java中,实数使用float和double数据类型表示。float类型是32位单精度浮点数,double类型是64位双精度浮点数。这两种类型都符合IEEE 754-1985标准。这个标准规定了浮点数的格式和运算方式。
浮点数可以以字面量的形式写在Java程序中,其格式为一些可选数字,后面跟一个小数点和一些数字,例如:
123.45
0.0
.01
浮点数字面量还可以使用指数形式(科学计数法)表示。其格式为一个数后面跟着字母e或者E和一个数,第二个数表示10的次方,是第一个数的乘数。例如:
1.2345E02 // 1.2345 * 10^2或123.45
1e-6 // 1 * 10^-6或0.000001
6.02e23 //阿伏加德罗常数:6.02 * 10^23
默认情况下,浮点数都是double类型,若想在程序中使用float类型,要在数字后面加上f或者F,例如:
double d = 6.02E23;
float f = 6.02e23f;
浮点数字字面量不能使用十六进制,二进制或者八进制表示。
浮点数表示的值
由于本质上的限制,大多数实数都不能使用有限的位数进行精确表示,因此要记住,float和double类型都只能表示实际值的近似值。float类型是32位近似值,至少有6个有效数字,double是64位近似值,至少有15个有效数字。
除了表示普通的数字之外,float和double还能表示四个特殊的值:正无穷大,负无穷大,零和NaN。如果浮点数运算的结果超出了float或double能表示的范围上线得到的是无穷大。如果浮点数的运算结果超出了float或double能表示的范围下限,得到的是零。
Java的浮点类型区分正零和负零,具体是哪个值取决于从哪个方向出现的下溢,在实际使用中,正零和负零的表现基本一样。最后一种特殊的浮点数NaN,是“Not-a-Number”的简称,表示“不是数字”。如果浮点数运算不合法,例如0.0/0.0,得到的就是NaN,例如:
double inf = 1.0/0.0; // 无穷大
double neginf = -1.0/0.0; // 负无穷大
double negzero = -1.0/inf; // 负零
double NaN = 0.0/0.0; // NaN
Java浮点数类型能处理到无穷大的上溢以及到零的下溢,因此浮点数运算从不抛出异常,就算执行非法运算也没事,例如零除以零,或者计算负数的平方根。
float和double基本类型都有对应的包装类,分别为Float和Double。这两个类都定义了一些有用的常量,如:MIN_VALUE、MAX_VALUE、NEGATIVE_INFINITY、POSITIVE_INFINITY 和 NaN。
无穷大浮点数的表现和设想的一样,例如,无穷大之间的加减运算得到的还是无穷大,负零的表现几乎和正零一样。而且实际上,相当判断运算符==会告诉你,负零和正零是相等的,区分正零和负零还有普通的零有一种方法,把它作为被除数:1.0/0.0得到的是正无穷大,但是1.0/负零得到的是负无穷大。因为NaN不是数字,所以==运算符会告诉我们它不等于任何其它数字,甚至包括它自己,若是想检查某个float或者double值是否为NaN,必须使用 Float.isNaN() 或 Double.isNaN() 方法。