zoukankan      html  css  js  c++  java
  • java之double类型数值的比较

    先看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
     
    */
  • 相关阅读:
    循环神经网络(RNN)的改进——长短期记忆LSTM
    AlphaGO的背后/《mastering the game of GO wtth deep neural networks and tree search》研究解读
    <科普>CPU进行四则运算(加减乘除)的主流方法
    在CV尤其是CNN领域的一些想法
    只要听说过电脑的人都能看懂的网上pdf全书获取项目
    python简单爬虫(爬取pornhub特定关键词的items图片集)
    并查集模板
    Linux命令学习-cp命令
    Linux命令学习-mv命令
    Linux命令学习-ls命令
  • 原文地址:https://www.cnblogs.com/westward/p/5332785.html
Copyright © 2011-2022 走看看