咱们知道浮点数存在精度丢失问题,为了精度问题,咱们经常不直接使用浮点数,经常是采用BigDecimal来替换浮点数。本文主要想探索一下BigDecimal相比于double性能上可能存在的一些问题。java
因而写了一个简单的测试程序以下:(注:如下测试为了纯测试和比较!)算法
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倍。 spa
也难怪个人那个算法,double几分钟就搞定了,用BigDecimal花了几个小时。 code
不知道以上的测试结果靠谱吗???? ip
仍是我对BigDecimal使用有误?ci