鷹翔宇空

          學習和生活

          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
          不知道是咋回事 代碼一摸一樣  回復  更多評論
            

          主站蜘蛛池模板: 瑞安市| 平武县| 中超| 黎平县| 许昌市| 黑山县| 江川县| 托克托县| 红安县| 岑溪市| 德格县| 岳阳市| 双鸭山市| 浮梁县| 承德市| 禄丰县| 阳山县| 商都县| 西安市| 滁州市| 兴安盟| 乡城县| 黎城县| 株洲县| 南皮县| 临高县| 偏关县| 东莞市| 舟曲县| 定襄县| 枣阳市| 阆中市| 鄯善县| 手机| 怀仁县| 通辽市| 乐东| 延安市| 永兴县| 靖安县| 浑源县|