<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-71  評論-5  文章-0  trackbacks-0

    在項目當中,對于double類型數(shù)據(jù)的使用比較頻繁。尤其是處理金錢相關(guān)的數(shù)據(jù),在使用Double類型的數(shù)據(jù)時,涉及到精度,顯示,四舍五入等等問題。

    1.  顯示問題,當double 數(shù)據(jù) 小于 0.0001 大于等于 10000000時,直接轉(zhuǎn)為String輸出時,會顯示為科學計數(shù)法。

       1:  double double1 = 0.00009;
       2:  System.out.println(double1); // 9.0E-5
       3:         
       4:  double double2 = 10000000;
       5:  System.out.println(double2); // 1.0E7

    需要使用DecimalFormat 轉(zhuǎn)化輸出

       1:  DecimalFormat formate = new DecimalFormat("#.######");
       2:  System.out.println(formate.format(double1)); //0.00009
       3:          
       4:  formate = new DecimalFormat("########.##");
       5:  System.out.println(formate.format(double2));//10000000
     
    這里面會有四舍五入問題:
       1:  double double1 = 0.000096789;
       2:  DecimalFormat formate = new DecimalFormat("#.######");
       3:  System.out.println(formate.format(double1)); //0.000097

    當取小數(shù)點后六位時,會在第七位四舍五入。

     

    2. 誤差問題,兩個Double類型的數(shù),進行運算。經(jīng)常會產(chǎn)生誤差。

       1:  System.out.println(0.05 + 0.01); //0.060000000000000005
       2:  System.out.println(1.0 - 0.42);  //0.5800000000000001
       3:  System.out.println(4.015 * 100); //401.49999999999994
       4:  System.out.println(123.3 / 100); //1.2329999999999999

    看似簡單的計算,結(jié)果卻出人意料。解決方法是將Double轉(zhuǎn)為BigDecimal。調(diào)用BigDecimal的 運算。

       1:   double d1 = 0.05;
       2:   double d2 = 0.01;
       3:   BigDecimal b1 = new BigDecimal(Double.toString(d1));
       4:   BigDecimal b2 = new BigDecimal(Double.toString(d2));
       5:   System.out.println(b1.add(b2));  //0.06
     
    需要注意的是,如果new BigDecimal()時使用的是double類型的構(gòu)造方法。問題依舊是可能存在的,這邊要使用String參數(shù)的構(gòu)造方法。
     
    3. 兩個double比較的問題。將double數(shù)的運算結(jié)果和0比較。由于精度問題,比如if(1-0.999999999999999999 == 0.0) 這個是成立的。
     
    附上double數(shù)的運算:
       1:      /**
       2:       * 兩個Double數(shù)相加
       3:       * 
       4:       * @param v1
       5:       * @param v2
       6:       * @return
       7:       */
       8:      public static double doubleAdd(Double v1, Double v2) {
       9:   
      10:          BigDecimal b1 = new BigDecimal(v1.toString());
      11:   
      12:          BigDecimal b2 = new BigDecimal(v2.toString());
      13:   
      14:          return b1.add(b2).doubleValue();
      15:   
      16:      }
      17:   
      18:      /**
      19:       * 兩個Double數(shù)相減
      20:       * 
      21:       * @param v1
      22:       * @param v2
      23:       * @return
      24:       */
      25:      public static double doubleSub(Double v1, Double v2) {
      26:   
      27:          BigDecimal b1 = new BigDecimal(v1.toString());
      28:   
      29:          BigDecimal b2 = new BigDecimal(v2.toString());
      30:   
      31:          return b1.subtract(b2).doubleValue();
      32:   
      33:      }
      34:   
      35:      /**
      36:       * 兩個Double數(shù)相乘
      37:       * 
      38:       * @param v1
      39:       * @param v2
      40:       * @return
      41:       */
      42:      public static double doubleMul(Double v1, Double v2) {
      43:   
      44:          BigDecimal b1 = new BigDecimal(v1.toString());
      45:   
      46:          BigDecimal b2 = new BigDecimal(v2.toString());
      47:   
      48:          return b1.multiply(b2).doubleValue();
      49:   
      50:      }
      51:   
      52:      /**
      53:       * 兩個Double數(shù)相除
      54:       * 
      55:       * @param v1
      56:       * @param v2
      57:       * @return
      58:       */
      59:      public static double doubleDiv(Double v1, Double v2) {
      60:   
      61:          BigDecimal b1 = new BigDecimal(v1.toString());
      62:   
      63:          BigDecimal b2 = new BigDecimal(v2.toString());
      64:   
      65:          return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP)
      66:                  .doubleValue();
      67:   
      68:      }
      69:   
      70:      /**
      71:       * 兩個Double數(shù)相除,并保留scale位小數(shù)
      72:       * 
      73:       * @param v1
      74:       * @param v2
      75:       * @param scale
      76:       * @return
      77:       */
      78:      public static double doubleDiv(Double v1, Double v2, int scale) {
      79:   
      80:          if (scale < 0) {
      81:   
      82:              throw new IllegalArgumentException(
      83:   
      84:              "The scale must be a positive integer or zero");
      85:   
      86:          }
      87:          int DEF_DIV_SCALE = 10;
      88:   
      89:          BigDecimal b1 = new BigDecimal(v1.toString());
      90:   
      91:          BigDecimal b2 = new BigDecimal(v2.toString());
      92:   
      93:          return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
      94:   
      95:      }
    posted on 2015-04-22 18:11 藤本薔薇 閱讀(178) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲高清免费视频| 免费va在线观看| 精品亚洲麻豆1区2区3区| 精选影视免费在线 | 国产成人精品日本亚洲专区 | 免费观看黄色的网站| 亚洲电影国产一区| 999任你躁在线精品免费不卡| 亚洲一二成人精品区| 99久9在线|免费| 国产精品高清视亚洲精品| 我想看一级毛片免费的| 亚洲人片在线观看天堂无码| 噜噜嘿在线视频免费观看| 青娱乐在线视频免费观看| 国产成人毛片亚洲精品| 日本免费A级毛一片| 亚洲国语精品自产拍在线观看| 久久精品无码专区免费青青| 亚洲伊人久久精品| 免费看的一级毛片| h视频免费高清在线观看| 久久亚洲精品中文字幕无码 | 伊人久久五月丁香综合中文亚洲| 成人毛片免费网站| eeuss影院www天堂免费| 亚洲视频免费在线观看| 四虎在线免费播放| 中国内地毛片免费高清| 亚洲精品456在线播放| 国产精品美女自在线观看免费| 一级成人a做片免费| 亚洲人成网www| 午夜私人影院免费体验区| 一个人免费观看视频在线中文| 亚洲国产香蕉碰碰人人| 精品久久久久久久免费加勒比| 99re6在线视频精品免费| 亚洲一级片在线播放| 亚洲一区二区三区偷拍女厕 | 国产成人99久久亚洲综合精品|