這一片海,源于那一瓢水

          BigDecimal常用方法

          public class Arith {

          /**
          * 由于Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精
          * 確的浮點數運算,包括加減乘除和四舍五入。
          */
          //默認除法運算精度
          private static final int DEF_DIV_SCALE = 10;
             
          //這個類不能實例化
          private Arith(){
          }

              /**
               * 提供精確的加法運算。
               * @param v1 被加數
               * @param v2 加數
               * @return 兩個參數的和
               */
              public static double add(double v1,double v2){
                  BigDecimal b1 = new BigDecimal(Double.toString(v1));
                  BigDecimal b2 = new BigDecimal(Double.toString(v2));
                  return b1.add(b2).doubleValue();
              }
              /**
               * 提供精確的減法運算。
               * @param v1 被減數
               * @param v2 減數
               * @return 兩個參數的差
               */
              public static double sub(double v1,double v2){
                  BigDecimal b1 = new BigDecimal(Double.toString(v1));
                  BigDecimal b2 = new BigDecimal(Double.toString(v2));
                  return b1.subtract(b2).doubleValue();
              }
              /**
               * 提供精確的乘法運算。
               * @param v1 被乘數
               * @param v2 乘數
               * @return 兩個參數的積
               */
              public static double mul(double v1,double v2){
                  BigDecimal b1 = new BigDecimal(Double.toString(v1));
                  BigDecimal b2 = new BigDecimal(Double.toString(v2));
                  return b1.multiply(b2).doubleValue();
              }

              /**
               * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到
               * 小數點以后10位,以后的數字四舍五入。
               * @param v1 被除數
               * @param v2 除數
               * @return 兩個參數的商
               */
              public static double div(double v1,double v2){
                  return div(v1,v2,DEF_DIV_SCALE);
              }

              /**
               * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指
               * 定精度,以后的數字四舍五入。
               * @param v1 被除數
               * @param v2 除數
               * @param scale 表示表示需要精確到小數點以后幾位。
               * @return 兩個參數的商
               */
              public static double div(double v1,double v2,int scale){
                  if(scale<0){
                      throw new IllegalArgumentException(
                          "The scale must be a positive integer or zero");
                  }
                  BigDecimal b1 = new BigDecimal(Double.toString(v1));
                  BigDecimal b2 = new BigDecimal(Double.toString(v2));
                  return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
              }

              /**
               * 提供精確的小數位四舍五入處理。
               * @param v 需要四舍五入的數字
               * @param scale 小數點后保留幾位
               * @return 四舍五入后的結果
               */
              public static double round(double v,int scale){
                  if(scale<0){
                      throw new IllegalArgumentException(
                          "The scale must be a positive integer or zero");
                  }
                  BigDecimal b = new BigDecimal(Double.toString(v));
                  BigDecimal one = new BigDecimal("1");
                  return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
              }
             
             /**
              * 提供精確的類型轉換(Float)
              * @param v 需要被轉換的數字
              * @return 返回轉換結果
              */
              public static float convertsToFloat(double v){
              BigDecimal b = new BigDecimal(v);
              return b.floatValue();
              }
             
              /**
          * 提供精確的類型轉換(Int)不進行四舍五入
          * @param v 需要被轉換的數字
          * @return 返回轉換結果
          */
          public static int convertsToInt(double v){
          BigDecimal b = new BigDecimal(v);
              return b.intValue();
          }

          /**
          * 提供精確的類型轉換(Long)
          * @param v 需要被轉換的數字
          * @return 返回轉換結果
          */
          public static long convertsToLong(double v){
          BigDecimal b = new BigDecimal(v);
              return b.longValue();
          }

          /**
          * 返回兩個數中大的一個值
          * @param v1 需要被對比的第一個數
          * @param v2 需要被對比的第二個數
          * @return 返回兩個數中大的一個值
          */
          public static double returnMax(double v1,double v2){
          BigDecimal b1 = new BigDecimal(v1);
          BigDecimal b2 = new BigDecimal(v2);
              return b1.max(b2).doubleValue();
          }

          /**
          * 返回兩個數中小的一個值
          * @param v1 需要被對比的第一個數
          * @param v2 需要被對比的第二個數
          * @return 返回兩個數中小的一個值
          */
          public static double returnMin(double v1,double v2){
          BigDecimal b1 = new BigDecimal(v1);
          BigDecimal b2 = new BigDecimal(v2);
              return b1.min(b2).doubleValue();
          }

          /**
          * 精確對比兩個數字
          * @param v1 需要被對比的第一個數
          * @param v2 需要被對比的第二個數
          * @return 如果兩個數一樣則返回0,如果第一個數比第二個數大則返回1,反之返回-1
          */
          public static int compareTo(double v1,double v2){
          BigDecimal b1 = new BigDecimal(v1);
          BigDecimal b2 = new BigDecimal(v2);
              return b1.compareTo(b2);
          }

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

          My Links

          Blog Stats

          常用鏈接

          留言簿

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          最新評論

          主站蜘蛛池模板: 仙游县| 文成县| 苏尼特左旗| 武冈市| 石门县| 凉城县| 醴陵市| 梅河口市| 华宁县| 孝义市| 宁德市| 灵山县| 普兰县| 和田市| 纳雍县| 沾益县| 通江县| 时尚| 城固县| 易门县| 达日县| 阳朔县| 阜阳市| 绥棱县| 巧家县| 诸城市| 垣曲县| 大足县| 舒兰市| 周至县| 龙海市| 盐津县| 北票市| 平江县| 天峻县| 乌兰县| 廊坊市| 安徽省| 胶州市| 望城县| 宜阳县|