浮点数运算和整数运算相比,只能进行加减乘除这些数值运算,不能作位运算和移位运算。java
在计算机中,浮点数虽然表示的范围很大,可是浮点数有个很是重要的特色,就是浮点数经常没法精确表示code
举例blog
浮点数0.1
在计算机中就没法精确表示,由于十进制的0.1
换算成二进制是一个无限循环小数,很显然,不管使用float
仍是double
,都只能存储一个0.1
的近似值。可是,0.5
这个浮点数又能够精确地表示。由于浮点数经常没法精确表示,所以,浮点数运算会产生偏差:内存
public class Main { public static void main(String[] args) { double x=1.0 / 10; double y=1-9.0 / 10; System.out.println(x); System.out.println(y); } }
运行结果get
0.1 0.09999999999999998
因为浮点数存在运算偏差,因此比较两个浮点数是否相等经常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数:编译器
public class Main { public static void main(String[] args) { double x=1.0 / 10; double y=1-9.0 / 10; System.out.println(x); System.out.println(y); double r=Math.abs(x-y); if(r<0.00001) { System.out.println("true"); } else { System.out.println("false"); } } }
浮点数在内存的表示方法和整数比更加复杂。Java的浮点数彻底遵循IEEE-754标准,这也是绝大多数计算机平台都支持的浮点数标准表示方法。it
若是参与计算的两个数其中一个是整型,那么整型能够自动提高到浮点型编译
public class Main { public static void main(String[] args) { int n=5; double d=1.2+24.0/n; System.out.println(d); //6.0 } }
须要特别注意,在一个复杂的四则运算中,两个整数的运算不会出现自动提高的状况。例如:class
double d = 1.2 + 24 / 5; // 5.2
计算结果为4.2,缘由是编译器计算24/5这个子表达式时,按两个整数进行运算,结果为4,而不是按浮点运算4.8循环
整数运算在除数为0
时会报错,而浮点数运算在除数为0
时,不会报错,但会返回几个特殊值:
NaN
表示Not a NumberInfinity
表示无穷大-Infinity
表示负无穷大例如
double d1 = 0.0 / 0; // NaN double d2 = 1.0 / 0; // Infinity double d3 = -1.0 / 0; // -Infinity
这三种特殊值使用较少
能够将浮点数强制转型为整数,在转型时,浮点数的小数部分会被丢弃。若是转型后超过了整型能表示的最大范围,将返回整型最大值
public class Main { public static void main(String[] args) { int n1=(int) 12.3; //12 System.out.println(n1); int n2=(int) 12.7; //12 System.out.println(n2); int n3=(int) -12.7; //-12 System.out.println(n3); int n4=(int) 9999999991.11; //2147483647 System.out.println(n4); } }
浮点数没法精确表示,而且浮点数的运算结果可能有偏差。
比较两个浮点数一般比较他们的绝对值之差是否小于一个特定值。
整型和浮点型运算时,整型会自动提高为浮点型。
能够将浮点型强制转换为整型,但超出范围后将始终返回整型的最大值。