我们知道 java 里面有个 BigDecimal ,可以解决我们的精度丢失问题。
但是很少关注其性能情况,因为一般来说可以忽略不计的。
也确实,解决大数据量运算 java 本身并不适合。
本人愚笨,很早之前用 java 解决一个大数据量运算的算法,对性能要求很高。中间用了 BigDecimal ,注意到其性能的一些情况,发现其性能是 double 的 100 倍左右。
具体没有去深究其原因,平时其实也不用对这个在意,但是对这个知识做个基本的了解还是有必要的。
直接上代码:
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:572537012
result by Double:1346400.000387465
time used:5280000
timeUsed1/timeUsed2=108
对比图:
从以上结果来看,bigDecimal的性能可见一斑。其性能竟然是double的100倍,这是很早之前没想到的。