咱們知道浮點數存在精度丟失問題,爲了精度問題,咱們經常不直接使用浮點數,經常是採用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