鹰翔宇空

学习和生活

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 阅读(5802) 评论(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
不知道是咋回事 代码一摸一样  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: