金融、科學、工程---科學計算

          因為float和double不能精確的表達,或者任何10的負n次方。他們是設計來進行科學和工程上的計算,提供精確的近似值的。它們在涉及金融方面的計算則是不在行的。因為金融方面要求絕對的精確。



            1 package test.test;
            2 
            3 import java.math.BigDecimal;
            4 
            5 /**
            6  * 由于Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精 確的浮點數運算,包括加減乘除和四舍五入。
            7  */
            8 
            9 public class Test {
           10     // 默認除法運算精度
           11     private static final int DEF_DIV_SCALE = 10;
           12 
           13     // 這個類不能實例化
           14     public Test() {
           15     }
           16 
           17     
           18     
           19     /**
           20      * 提供精確的加法運算。
           21      * @param v1    被加數
           22      * @param v2     加數
           23      * @return 兩個參數的和
           24      */
           25     public static double add(double v1, double v2) {
           26 
           27         BigDecimal b1 = new BigDecimal(Double.toString(v1));
           28 
           29         BigDecimal b2 = new BigDecimal(Double.toString(v2));
           30 
           31         return b1.add(b2).doubleValue();
           32 
           33     }
           34 
           35     /**
           36      * 提供精確的減法運算。
           37      * @param v1    被減數
           38      * @param v2    減數
           39      *@return 兩個參數的差
           40      */
           41     public static double sub(double v1, double v2) {
           42 
           43         BigDecimal b1 = new BigDecimal(Double.toString(v1));
           44 
           45         BigDecimal b2 = new BigDecimal(Double.toString(v2));
           46 
           47         return b1.subtract(b2).doubleValue();
           48     }
           49 
           50     /**
           51      * 提供精確的乘法運算。
           52      * @param v1    被乘數
           53      * @param v2    乘數
           54      * @return 兩個參數的積
           55      */
           56     public static double mul(double v1, double v2) {
           57 
           58         BigDecimal b1 = new BigDecimal(Double.toString(v1));
           59 
           60         BigDecimal b2 = new BigDecimal(Double.toString(v2));
           61 
           62         return b1.multiply(b2).doubleValue();
           63 
           64     }
           65 
           66     /**
           67      * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 108. 109. * 小數點以后10位,以后的數字四舍五入。 
           68      * @param v1    被除數 
           69      * @param v2    除數 
           70      * @return 兩個參數的商 
           71      */
           72     public static double div(double v1, double v2) {
           73         return div(v1, v2, DEF_DIV_SCALE);
           74     }
           75 
           76     /**
           77      * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以后的數字四舍五入。
           78      * @param v1    被除數
           79      * @param v2    除數
           80      * @param scale    表示表示需要精確到小數點以后幾位。
           81      * @return 兩個參數的商
           82      */
           83     public static double div(double v1, double v2, int scale) {
           84         if (scale < 0) {
           85             throw new IllegalArgumentException("The scale must be a positive integer or zero");
           86         }
           87         BigDecimal b1 = new BigDecimal(Double.toString(v1));
           88 
           89         BigDecimal b2 = new BigDecimal(Double.toString(v2));
           90 
           91         return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
           92     }
           93 
           94     /**
           95      * 提供精確的小數位四舍五入處理。
           96      * @param     需要四舍五入的數字
           97      * @param scale    小數點后保留幾位
           98      * @return 四舍五入后的結果
           99      */
          100     public static double round(double v, int scale) {
          101 
          102         if (scale < 0) {
          103             throw new IllegalArgumentException("The scale must be a positive integer or zero");
          104         }
          105 
          106         BigDecimal b = new BigDecimal(Double.toString(v));
          107 
          108         BigDecimal one = new BigDecimal("1");
          109 
          110         return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
          111 
          112     }
          113 
          114 }


          posted on 2009-08-07 13:54 彭偉 閱讀(247) 評論(0)  編輯  收藏 所屬分類: java技術分區

          <2009年8月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乌海市| 安徽省| 阿勒泰市| 东光县| 洪泽县| 罗平县| 保德县| 元谋县| 渭源县| 本溪市| 邵阳市| 汤原县| 黄石市| 南平市| 郯城县| 乌海市| 台南县| 罗平县| 安徽省| 芮城县| 梁河县| 滕州市| 彭水| 西华县| 怀安县| 海口市| 吉林省| 九龙县| 吉木萨尔县| 镇原县| 连城县| 灌阳县| 洛川县| 凤山市| 武邑县| 科技| 原平市| 绥中县| 建平县| 吉林省| 承德市|