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

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



            1 package test.test;
            2 
            3 import java.math.BigDecimal;
            4 
            5 /**
            6  * 由于Java的簡單類型不能夠精確的對浮點數(shù)進行運算,這個工具類提供精 確的浮點數(shù)運算,包括加減乘除和四舍五入。
            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    被加數(shù)
           22      * @param v2     加數(shù)
           23      * @return 兩個參數(shù)的和
           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    被減數(shù)
           38      * @param v2    減數(shù)
           39      *@return 兩個參數(shù)的差
           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    被乘數(shù)
           53      * @param v2    乘數(shù)
           54      * @return 兩個參數(shù)的積
           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      * 提供(相對)精確的除法運算,當發(fā)生除不盡的情況時,精確到 108. 109. * 小數(shù)點以后10位,以后的數(shù)字四舍五入。 
           68      * @param v1    被除數(shù) 
           69      * @param v2    除數(shù) 
           70      * @return 兩個參數(shù)的商 
           71      */
           72     public static double div(double v1, double v2) {
           73         return div(v1, v2, DEF_DIV_SCALE);
           74     }
           75 
           76     /**
           77      * 提供(相對)精確的除法運算。當發(fā)生除不盡的情況時,由scale參數(shù)指 定精度,以后的數(shù)字四舍五入。
           78      * @param v1    被除數(shù)
           79      * @param v2    除數(shù)
           80      * @param scale    表示表示需要精確到小數(shù)點以后幾位。
           81      * @return 兩個參數(shù)的商
           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      * 提供精確的小數(shù)位四舍五入處理。
           96      * @param     需要四舍五入的數(shù)字
           97      * @param scale    小數(shù)點后保留幾位
           98      * @return 四舍五入后的結(jié)果
           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 彭偉 閱讀(244) 評論(0)  編輯  收藏 所屬分類: java技術分區(qū)

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

          導航

          統(tǒng)計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鹤岗市| 宁德市| 保山市| 南投县| 大庆市| 班戈县| 嘉善县| 定远县| 子洲县| 六枝特区| 大安市| 缙云县| 登封市| 湛江市| 德阳市| 宝兴县| 哈巴河县| 孝义市| 视频| 乌兰察布市| 万源市| 玉树县| 威宁| 赫章县| 自治县| 米脂县| 南溪县| 上饶市| 南宫市| 呈贡县| 黑河市| 策勒县| 永定县| 高阳县| 石首市| 凤翔县| 黄骅市| 龙游县| 汝南县| 武隆县| 明星|