先看demo:

public class L26 {

    /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// double a= 300000;
double x= 300000.00000000003;//double比较,小数点后有效位
double y= 300000.000000000003;//主要注意的是double类型直接==/>=/<=的比较,涉及到有效位
System.out.println(x<=300000);
System.out.println(y<=300000);
} }
/*
*output:
*false
true
* */

总结:double是双精度基本数据类型,double与double之间,涉及==(包括>=,<=)的比较,就得考虑double的精度问题。

如上面的例子,

当x=300000.00000000003,与

300000比较,得到的是false,说明300000.00000000003>300000;

当y=300000.000000000003,与

300000比较,得到的是true,说明300000.00000000003<=300000;(jvm实际判定的是300000.000000000003==300000)猛然看上去,感觉不对啊,应该是大于啊。这就是double的精度问题。当小数点后位数 大于(17-6)11位时,jvm就会忽略这个精度,这时的y=300000.00000000000。所以jvm就会判定y==300000.

这种情况,我们在开发时如果需要更精确的比较double类型,就要用到 BigDecimal 这个类了。

上面我为什么用17-6呢?看下这个例子:

public static void main(String[] args) {
double x= 3.0000000000000003;//double比较,小数点后有效位:17-(整数位)。总有效位为17位
double y= 30.000000000000003;//17位数字
double z= 300.00000000000003;
double w= 3000.0000000000003; System.out.println(x==3);
System.out.println(y==30);
System.out.println(z==300);
System.out.println(w==3000);
System.out.println("--------------------分界线-------------------");
//小数后都加一个0
double x1= 3.00000000000000003;//18位数字
double y1= 30.0000000000000003;
double z1= 300.000000000000003;
double w1= 3000.00000000000003; System.out.println(x1==3);
System.out.println(y1==30);
System.out.println(z1==300);
System.out.println(w1==3000);
} }
/*
output:
false
false
false
false
--------------------分界线-------------------
true
true
true
true */

最新文章

  1. CXF 动态创建客户端调用稳定版本号为2.7.18
  2. iOS 判断内容是否是中文,两种实现
  3. POJ 2478 Farey Sequence(欧拉函数前n项和)
  4. Codeforces 389A (最大公约数)
  5. ccc2016
  6. Oracle 10g安装64位图解流程
  7. hough变换
  8. 深入浅出ES6(十七):展望未来
  9. 绝对定位的DIV绝对居中显示
  10. poj 2411 新写法
  11. Angular JS 学习笔记(一)
  12. ARM开发软件ADS教程
  13. Android HTTP请求用HttpUrlConnection与HttpClient比较
  14. dat.gui stats.js 通用参数配置及图像统计工具
  15. LoadRunner 11 error:Cannot initialize driver dll
  16. 创建自定义的 Angular Schematics
  17. zabbix3.4.7利用Windows性能监视器监控各项资源指标
  18. mybatis集成redis
  19. memcached命令知识
  20. answerOpenCV轮廓类问题解析

热门文章

  1. EOS主网节点部署
  2. 洛谷P2325王室联邦 SCOI2005 构造+树上分块
  3. Python高级编程技巧(转)
  4. SHFileOperation的用法
  5. (2.12)Mysql之SQL基础——存储过程条件定义与错误处理
  6. mysql 整数类型 数值类型 tinyint
  7. Randcher 2.0部署K8s集群(一)
  8. hadoop2.x Federation
  9. HTML5游戏开发系列教程10(译)
  10. poj1434 Fill the Cisterns!