我们知道浮点数存在精度丢失问题,为了精度问题,我们常常不直接使用浮点数,常常是采用BigDecimal来替换浮点数。本文主要想探索一下BigDecimal相比于double性能上可能存在的一些问题。
于是写了一个简单的测试程序如下:(注:以下测试为了纯测试和比较!)
import java.math.BigDecimal;
public class BigDecimalEfficiency {
public static int REPEAT_TIMES = 1000000;
public static double computeByBigDecimal(double a, double b) {
BigDecimal result = BigDecimal.valueOf(0);
BigDecimal decimalA = BigDecimal.valueOf(a);
BigDecimal decimalB = BigDecimal.valueOf(b);
for (int i = 0; i < REPEAT_TIMES; i++) {
result = result.add(decimalA.multiply(decimalB));
}
return result.doubleValue();
}
public static double computeByDouble(double a, double b) {
double result = 0;
for (int i = 0; i < REPEAT_TIMES; i++) {
result += a * b;
}
return result;
}
public static void main(String[] args) {
long test = System.nanoTime();
long start1 = System.nanoTime();
double result1 = computeByBigDecimal(0.120000000034, 11.22);
long end1 = System.nanoTime();
long start2 = System.nanoTime();
double result2 = computeByDouble(0.120000000034, 11.22);
long end2 = System.nanoTime();
long timeUsed1 = (end1 - start1);
long timeUsed2 = (end2 - start2);
System.out.println("result by BigDecimal:" + result1);
System.out.println("time used:" + timeUsed1);
System.out.println("result by Double:" + result2);
System.out.println("time used:" + timeUsed2);
System.out.println("timeUsed1/timeUsed2=" + timeUsed1 / timeUsed2);
}
}
运行结果如下:
result by BigDecimal:1346400.00038148
time used:365847335
result by Double:1346400.000387465
time used:5361855
timeUsed1/timeUsed2=68
从结果上来看BigDecimal给我们带来了精度上的提升,但是性能上的损耗是巨大的。同样的运算时间居然是double的68倍。
也难怪我的那个算法,double几分钟就搞定了,用BigDecimal花了几个小时。
不知道以上的测试结果靠谱吗????
还是我对BigDecimal使用有误?
来源:oschina
链接:https://my.oschina.net/u/4873/blog/15398