Java中float和double的精度
比较基本类型double和float和某一个数是否相等的时候,不要用==或>=或<=,因为double和float都是有精度问题的,计算机只能保存一定位数的小数,这就会存在精度问题。
下面我们看一下java中float和double能够比较到小数后几位:
代码实现:
public class Main { public static void main(String[] args) { float f6 = 1.000003f;//6位小数位,总共7位 float f_8 = 10.000003f;//6位小数位,总共8位 double d15 = 1.000000000000003;//15位小数位,总共16位 double d_17 = 10.000000000000003;//15位小数位,总共17位 float f7 = 1.0000003f;//7位小数位,总共8位 float f_9 = 10.0000003f;//7位小数位,总共9位 double d16 = 1.0000000000000003;//16位小数位,总共17位 double d_18 = 10.0000000000000003;//16位小数位,总共18位 float f8 = 1.00000003f;//8位小数位,总共9位 float f_10 = 10.00000003f;//8位小数位,总共10位 double d17 = 1.00000000000000003;//17位小数位,总共18位 double d_19 = 10.00000000000000003;//17位小数位,总共19位 System.out.println(f6==1); System.out.println(d15==1); System.out.println("------------------"); System.out.println(f7==1); System.out.println(d16==1); System.out.println("------------------"); System.out.println(f8==1); System.out.println(d17==1); System.out.println("------------------"); //----------------------------------------------- System.out.println(f_8==10); System.out.println(d_17==10); System.out.println("------------------"); System.out.println(f_9==10); System.out.println(d_18==10); System.out.println("------------------"); System.out.println(f_10==10); System.out.println(d_19==10); System.out.println("------------------"); } }
输出结果:
false
false
------------------
false
false
------------------
true
true
------------------
------------------------------------------
false
false
------------------
true
true
------------------
true
true
------------------
再举一个案例:
public class Main { public static void main(String[] args) { float f6 = 10000003.87f;//整数位8位,总共10位 float f_8 = 100000003.87f;//整数位9位,总共11位 System.out.println(f6==10000003); System.out.println(f_8==100000003); } }
输出结果:
false
true
上面两个案例说明,float和double的精确度是按照整体位数来的,并不是只是考虑小数部分。根据显示结果可以看出,float只能精确8位,double可以精确比较到17位,超出比较的精度就会得到错误的结果。