第04部分:浮点数类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第04部分:浮点数类型相关的知识,希望对你有一定的参考价值。

参考技术A 在Java中,实数使用float和double数据类型表示。float类型是32位单精度浮点数,double类型是64位双精度浮点数。这两种类型都符合IEEE 754-1985标准。这个标准规定了浮点数的格式和运算方式。

浮点数可以以字面量的形式写在Java程序中,其格式为一些可选数字,后面跟一个小数点和一些数字,例如:

浮点数字面量还可以使用指数形式(科学计数法)表示。其格式为一个数后面跟着字母e或者E和一个数,第二个数表示10的次方,是第一个数的乘数。例如:

默认情况下,浮点数都是double类型,若想在程序中使用float类型,要在数字后面加上f或者F,例如:

浮点数字字面量不能使用十六进制,二进制或者八进制表示。

由于本质上的限制,大多数实数都不能使用有限的位数进行精确表示,因此要记住,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,例如:

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() 方法。

两大基本数据类型 - 整数类型 / 浮点数类型

一、整数与浮点数之间的区别

   两者的存储方式不一样,整数是直接以二进制形式进行存储,对于浮点数,需要将小数部分和指数部分分开存储。两者之间的区别还有如下:

  1-整数没有小数部分,浮点数有小数部分;

  2-浮点数可以表示的范围比整数大;

  3-对于一些算术运算(两个很大的数相减),浮点数损失的精度更多;

  4-在任何区间内都存在着无数个实数,所以计算机的浮点数不能表示区间内的所有值,通常只是实际值的近似值;

  5-过去,浮点运算比整数运算慢,不过,有了浮点处理器,速度上的差距有了一定的缩小。

二、整数

   int类型是有符号整型,可以是正整数、负整数或零。其取值范围依计算机系统而异。一般而言,存储一个int数据需要占用一个机器字长,正负号会占用其中一位。处理器的机器字长越长,int的范围越大。ISO C 规定。int的取值范围最小为-32768~32767。

   八进制、十进制、十六进制int型数据的显示:%o - 八进制,%d - 十进制,%x - 十六进制。如果是需要显示各进制数的前缀0、0x和0X,必须分别使用%#o、%#x、%#oX。

   占用存储空间:short <= int < long < long long。【个人PC上常见的设置:long long - 64bit,long - 32bit, int - 16bit/32bit, short - 16bit。】【C 标准对基本数据类型之规定的允许的最小大小】

  short、long、long long 和 unsigned 类型数据的打印:%u - unsigned int;%ld - long int;%lo、%lx形式将long型数据以八进制、十六进制打印;对于short类型,使用 h 前缀,%hd,%ho等都是有效的;l 和 h 前缀都可以和 u 一块使用。【在使用printf()函数进行打印的时候,确保转换说明的类型与待打印值的类型相匹配,否则,会有意想不到的错误】

  对于short型数据,不管是以%hd形式进行打印还是以%d形式进行打印,结果都是一样的。【原因:在给函数传递参数时,C 编译器会把 short 类型的数据自动转换成 int。1 - 转换的原因为 int 类型被认为是计算机处理整数类型时最高效的类型,在short 和 int 类型的大小不同的计算机中,用 int 类型的参数传递熟读更快;2 - 使用 h 修饰符可以显示较大整数被截断成 short 类型值的情况。】

三、浮点数

  1、float、double、long double

  C 标准规定,float 类型必须至少能表示6位有效数字,且取值范围至少是10^(-37) ~ 10^(+37)。通常,系统存储一个 float 类型的数据需要占用32位,其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分(也叫做尾数或有效数)及其符号。

  double 类型和 float 类型的最小值范围相同,但至少能必须表示10位有效数字。一般情况下,double 类型的数据占用64位而不是32位,一些系统将多出的32位全部用来表示非指数部分,这种做法不仅增加了有效数字的位数(提高精度),还减少了舍入误差,还有一些系统会把其中的一些位分配给指数部分,以容纳更大的指数,增加可表示数的范围。无论如何,实际情况中 double 类型的数据至少有13位有效数字,超过最低标准。

  2、浮点型常量

  浮点型常量的基本形式:有符号的数据(包括小数点)+ e / E  + 有符号数表示10的指数。【e.g.:-1.56E+12,2.87e-3等】

  简写形式:‘ + ’可以省略;可以没有小数点【e.g. 2E5】或指数部分【e.g. 19.28】,但是二者不能同时省略;可以省略小数部分【e.g. 3.E16】或整数部分【e.g. .45E-6】,但是二者不能同时省略.除了上述的简写形式,以下几种简写形式也是有效的【3.14159、.2、4e16、.8E-5、100.0等】。【不要在浮点型常量中间加空格!!!】

  3、浮点数的使用

  float some = 1.0 * 2.0;

  默认情况下,编译器假定浮点型常量是double类型的精度。对于上述表达式的处理,4.0和2.0会被存储为64位的double类型,使用双精度进行乘法运算,然后将乘积截断成float类型的宽度。虽然说这种计算方式得出来结果精度更高,但是会减慢程序的运行速度。

  在浮点数后边加上 f / F 后缀可覆盖默认设置,编译器会将浮点数常量看作是 float 类型;使用 l / L 后缀使得数字成为long double 类型;没有后缀的浮点型常量是 double 类型。

  4、浮点数的打印

  %f - 打印十进制计数法的 float 和 double 类型浮点数【 %Lf 等亦可】;

  %e - 打印指数计数法的浮点数【 %Le 等亦可】;

  %a - 打印十六进制的浮点数(前提是系统支持)【 %La 等亦可】。

  5、浮点值的上溢和下溢

  上溢(overflow):数字过大,超过当前类型能表达的范围。

  下溢(underflow):当前类型数据的全精度被损失。

 

 

 

 

  

   

 

以上是关于第04部分:浮点数类型的主要内容,如果未能解决你的问题,请参考以下文章

frame的数值如果是浮点数,该怎么取舍只保留小数点后1位

第3课 浮点数的秘密

IEEE754表示浮点数

float_浮点数存储结构

浮点数 (IEEE-754)

java浮点数常量是啥