鷹翔宇空

          學習和生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

          有時在項目開發過程中,對數值的精度要求較高時可能就會用到java.math.BigDecimal,使用時發現有些用法效率較低。
          1:初始化一個java.math.BigDecimal時盡量用java.math.BigDecimal.valueOf(0)來替代new java.math.BigDecimal().
          2:比較兩個java.math.BigDecimal對象時,最好用equals(),而不要進行數值轉換,如:doubleValue等,測試發現凡涉及到類型轉換,性能都要受到較大影響。
          下面是自己寫的一段測試代碼:
          import java.math.BigDecimal;

          public class TestClass {
          ? public TestClass() {
          ? }
          ? public static void main(String[] args){
          ??? StringBuffer test = new StringBuffer();
          ??? BigDecimal tempBig = null;
          ??? long time1 = System.currentTimeMillis();
          ??? for(int i=0;i<200000;i++){
          ????? tempBig = new BigDecimal(0);
          ????? tempBig = null;
          ??? }
          ??? long time2 = System.currentTimeMillis();
          ??? System.out.println("===="+(time2-time1)+"=======");
          ??? System.out.println("====@@@@@@@@@@@@@@@@@@@@@=======");
          ??? long time3 = System.currentTimeMillis();
          ??? for(int i=0;i<200000;i++){
          ????? tempBig = BigDecimal.valueOf(0);
          ????? tempBig = null;
          ??? }
          ??? long time4 = System.currentTimeMillis();
          ??? System.out.println("===="+(time4-time3)+"=======");
          ??? System.out.println("====@@@@@@@@@@@@@@@@@@@@@=======");
          ??? tempBig = BigDecimal.valueOf(0);
          ??? BigDecimal ddd = new BigDecimal(1);
          ??? long time5 = System.currentTimeMillis();
          ??? for(int i=0;i<200000;i++){
          ????? if(tempBig.equals(ddd)){
          ????? }
          ??? }
          ??? long time6 = System.currentTimeMillis();
          ??? System.out.println("===="+(time6-time5)+"=======");
          ??? System.out.println("====@@@@@@@@@@@@@@@@@@@@@=======");
          ??? long time7 = System.currentTimeMillis();
          ??? for(int i=0;i<200000;i++){
          ????? if(tempBig.doubleValue()==0){
          ????? }
          ??? }
          ??? long time8 = System.currentTimeMillis();
          ??? System.out.println("===="+(time8-time7)+"=======");
          ??? System.out.println("====@@@@@@@@@@@@@@@@@@@@@=======");
          ? }
          }

          posted on 2006-09-25 14:11 TrampEagle 閱讀(5821) 評論(4)  編輯  收藏 所屬分類: 學習體會

          Feedback

          # re: 使用BigDecimal時提高系統性能的一些優化 2006-10-21 21:39 wmuu
          BigDeciaml.ZREO
          equals()實際上不好用應該多個精度的參數.
          原來認為bigDeciaml的實現會有些像bcd1248碼,結果不是.說是BigDecimal,結果確不是準確的Decimal還是近似的  回復  更多評論
            

          # re: 使用BigDecimal時提高系統性能的一些優化 2006-10-21 22:15 wmuu
          有看了一下發現說錯了,bigDecimal準確的十進制
          是以前new decimal的時候用了double  回復  更多評論
            

          # re: 使用BigDecimal時提高系統性能的一些優化 2006-12-20 20:58 hhq
          ====使用new 初始化 2000000 次===
          ====90=======
          =============================
          ====使用valueOf 初始化2000000 次===
          ====40=======
          =====================
          ====使用equals 判斷2000000 次===
          ====50=======
          ===============================
          ====使用doubleValue 判斷2000000 次===
          ====50=======
          ===============================


          IBM T41上的表現,差異非常有限,沒有什么意思  回復  更多評論
            

          # re: 使用BigDecimal時提高系統性能的一些優化 2007-11-23 16:25 5
          我仔使用的時候
          用如下代碼
          BigDecimal a=BigDecimal.valueOf(8.209);
          BigDecimal c=BigDecimal.valueOf(9.40).multiply(a);
          double d=c.doubleValue();

          在不同的機子上得到不同的精度值 77.1646 和77.16460000000001
          不知道是咋回事 代碼一摸一樣  回復  更多評論
            

          主站蜘蛛池模板: 新龙县| 九龙城区| 闸北区| 象山县| 台东县| 崇仁县| 凤翔县| 尼勒克县| 辽宁省| 大冶市| 蕲春县| 通城县| 霍山县| 麦盖提县| 大竹县| 富裕县| 博罗县| 瑞金市| 正宁县| 鄄城县| 绿春县| 景德镇市| 大连市| 江门市| 呈贡县| 乾安县| 林州市| 江津市| 宜宾县| 石家庄市| 朝阳市| 尚义县| 中宁县| 嘉黎县| 大关县| 修武县| 新泰市| 土默特左旗| 南城县| 平谷区| 清远市|