這一片海,源于那一瓢水

          java的double的精度問(wèn)題(轉(zhuǎn))

          在java中,使用double進(jìn)行運(yùn)算,有時(shí)會(huì)出現(xiàn)精度丟失的問(wèn)題,值會(huì)有那么0.00000***1偏差的偏差,導(dǎo)致匹配校驗(yàn)常常出現(xiàn)問(wèn)題

          解決方案如下:

            /** 
               * 對(duì)double數(shù)據(jù)進(jìn)行取精度. 
               * @param value  double數(shù)據(jù). 
               * @param scale  精度位數(shù)(保留的小數(shù)位數(shù)). 
               * @param roundingMode  精度取值方式. 
               * @return 精度計(jì)算后的數(shù)據(jù). 
               */ 
              public static double round(double value, int scale,
                       int roundingMode) {  
                  BigDecimal bd = new BigDecimal(value);  
                  bd = bd.setScale(scale, roundingMode);  
                  double d = bd.doubleValue();  
                  bd = null;  
                  return d;  
              }  


               /**
               * double 相加
               * @param d1
               * @param d2
               * @return
               */
              public double sum(double d1,double d2){
                  BigDecimal bd1 = new BigDecimal(Double.toString(d1));
                  BigDecimal bd2 = new BigDecimal(Double.toString(d2));
                  return bd1.add(bd2).doubleValue();
              }


              /**
               * double 相減
               * @param d1
               * @param d2
               * @return
               */
              public double sub(double d1,double d2){
                  BigDecimal bd1 = new BigDecimal(Double.toString(d1));
                  BigDecimal bd2 = new BigDecimal(Double.toString(d2));
                  return bd1.subtract(bd2).doubleValue();
              }

              /**
               * double 乘法
               * @param d1
               * @param d2
               * @return
               */
              public double mul(double d1,double d2){
                  BigDecimal bd1 = new BigDecimal(Double.toString(d1));
                  BigDecimal bd2 = new BigDecimal(Double.toString(d2));
                  return bd1.multiply(bd2).doubleValue();
              }


              /**
               * double 除法
               * @param d1
               * @param d2
               * @param scale 四舍五入 小數(shù)點(diǎn)位數(shù)
               * @return
               */
              public double div(double d1,double d2,int scale){
                  //  當(dāng)然在此之前,你要判斷分母是否為0,  
                  //  為0你可以根據(jù)實(shí)際需求做相應(yīng)的處理

                  BigDecimal bd1 = new BigDecimal(Double.toString(d1));
                  BigDecimal bd2 = new BigDecimal(Double.toString(d2));
                  return bd1.divide
                         (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
              }


          這樣,計(jì)算double類型的數(shù)據(jù)計(jì)算問(wèn)題就可以處理了。
          另外補(bǔ)充一下 JavaScript 四舍五入的方法:
          小數(shù)點(diǎn)問(wèn)題
          Math.round(totalAmount*100)/100 (保留 2 位)

          function formatFloat(src, pos)
          {
            return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);
          }

          posted on 2010-06-25 17:17 何方 閱讀(698) 評(píng)論(0)  編輯  收藏 所屬分類: java

          My Links

          Blog Stats

          常用鏈接

          留言簿

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 沈丘县| 山西省| 和田市| 天等县| 孝义市| 肥东县| 两当县| 马山县| 虞城县| 英超| 涿鹿县| 清丰县| 西充县| 盘山县| 庆云县| 南陵县| 杨浦区| 瑞安市| 泰宁县| 滦南县| 浦县| 色达县| 犍为县| 石狮市| 巴青县| 花垣县| 永川市| 平阳县| 田林县| 潜山县| 张家界市| 额济纳旗| 库尔勒市| 珠海市| 新疆| 工布江达县| 浦北县| 册亨县| 鄂温| 乌拉特中旗| 林口县|