BigDecimal 的性能問題

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

相關文章
相關標籤/搜索