[Java]高精度计算请考虑使用BigDecimal

转自:http://201211131343.iteye.com/blog/1968843

 

对于科学计算或者工程计算,我们通常会使用float或者double类型来存储浮点数。但是对于商业,货币或者税务计算,强烈推荐使用java.math包下的BigDecimal类。 

使用float或者double会发生精度丢失现象,比如:

double strange = 2 - 1.1;  
System.out.println(strange);  

打印的内容是:

0.8999999999999999  

 精度丢失了10E-16。

为了避免以上情况的发生,我们可以使用BigDecimal来代替float或者double.

BigDecimal operand1 = new BigDecimal("2");  
BigDecimal operand2 = new BigDecimal("1.1");  
  
BigDecimal result = operand1.subtract(operand2);  
System.out.println(result.toString());  

输出结果是我们期待的0.9,没有精度丢失。

BigDecimal的运算操作和原始数据类型有本质的区别,因为前者是类。所以对于+,-,*,/等运算在BigDecimal中分别用相应的add,subtract,multiply和divide等方法替代。

另外需要注意的是BigDecimal的构造函数,最常用的是BigDecimal(int)和BigDecimal(String),一般推荐使用后者,考虑下面这个情况:

1 BigDecimal odd = new BigDecimal(1.2);  
2 System.out.println(odd.toString());  

打印的结果是:

1 1.1999999999999999555910790149937383830547332763671875

而使用后者则会打印1.2。

除了算术运算有别于原始数据类型以外,关系运算符也有所不同。

原始数据类型的比较通常是使用<,<=,>,>=,!=等。

而BigDecimal是通过使用compareTo(BigDecimal)来比较的,具体比较情况如下:

1 BigDecimal a = new BigDecimal("1");  
2 BigDecimal b = new BigDecimal("2");  
3 BigDecimal c = new BigDecimal("1");  
4 int result1 = a.compareTo(b);  
5 int result2 = a.compareTo(c);  
6 int result3 = b.compareTo(a);  
7 System.out.println(result1);  
8 System.out.println(result2);  
9 System.out.println(result3);  

打印结果是:-1,0,1

即左边比右边数大,返回1,相等返回0,比右边小返回-1。

注意不能使用equals方法来比较大小。

 

使用BigDecimal的坏处是性能比double和float差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。

posted on 2013-11-16 23:57  dala  阅读(78)  评论(0)    收藏  举报

导航