[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的运算操作和原始数据类型有本质的区别,因为前者是类。所以对于+,-,*,/等运算在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,0,1
即左边比右边数大,返回1,相等返回0,比右边小返回-1。
注意不能使用equals方法来比较大小。
使用BigDecimal的坏处是性能比double和float差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。
浙公网安备 33010602011771号