2.3.2 小数类型

根据对小数精确程度的要求不同,将小数类型分为两种,分别为双精度类型和浮点类型。下面将依次讲解这两种类型。

1.双精度类型(double)

由于不能精确表示数据,所以小数默认使用相对更精确的双精度表示。双精度类型是默认类型,占8字节,如图2.22所示。

图2.22 双精度类型占8字节

它的有效范围为4.9E-324~1.7976931348623157E308,如图2.23所示。

图2.23 双精度类型的范围

注意:很多时候,在输入1.7976931348623158E308后,运行显示,是不会报错的,这是因为小数的不精确性导致的。

助记:double是一个英文单词,本身意思就是双倍,其发音为[ˈdʌbl]。

注意:有时候,为了强调一个数为双精度类型,可以添加d或D,如3.14d、0.5D。

示例2-5】下面将使用代码展示双精度类型的数据。代码如下:

运行结果如下:

注意:%f是printf的格式符,用来显示小数。

2.浮点类型(float)

很多时候不需要特别精确的数据。例如,使用圆周率的时候,只取小数点的后两位即可。这时,就可以使用浮点类型(也被称为单精度类型)。浮点类型占4字节,如图2.24所示。

图2.24 浮点类型占4字节

为了区分双精度类型和浮点类型,必须在浮点类型的数据后面添加f或F,否则这个数据还是会按照双精度类型的数据进行处理。

示例2-6】下面将使用代码展示浮点类型的数据。代码如下:

运行结果如下:

注意:在计算机中,0.6是无法按照二进制方式精确表示的,所以输出时会默认输出6位有效数字,即0.600000。其中,小数点前的0和小数点不算有效位数。

浮点类型的有效范围为1.4E-45~3.4028235E38,如图2.25所示。

图2.25 浮点类型的范围

助记:float是一个英文单词,本身意思就是浮动,其发音为[fləʊt]。

注意:小数在存储时都会将小数点进行浮动,这样就会省去将一个小数分开保存(整数部分和小数部分)的麻烦。

由于双精度类型和浮点类型的有效范围不容易被记住,所以在使用这两个类型时,可以通过最大值和最小值来查看有效范围。其中,最大值可以使用MAX_VALUE获取,最小值可以使用MIN_VALUE获取。以下代码用来获取这两个类型的最大值和最小值:

运行结果如下:

注意:在Java语言中,小数在运行时,会遇到无穷的情况。针对这种情况,Java语言提供了NEGATIVE_INFINITY、POSITIVE_INFINITY和NaN 3个特殊值,本书会在后面进行介绍。

综上,双精度类型和浮点类型都是用来表示小数的,但是它们所占用的字节数和有效范围不同,如表2.5所示。

表2.5 小数的类型