2015-01-02 32 views
3

我在這個程序中遇到了一個問題,我必須計算base^expo的值,並且base是一個實數,而exponent是一個整數。用(95.123)^12我期待548815620517731830194541.899025343415715973535967221869852721,但我的程序產生548815620517732160000000.000000,這是錯誤的。請提出一個更好的方法。Java:處理冪運算

// declare variables and read values 
double myBase = scan.nextDouble(); 
int myExponent = scan.nextInt(); 

// display result 
System.out.printf("%f", Math.pow(myBase, myExponent)); 
+3

越大的雙打就越不準確。 – kirbyquerby

+1

始終使用'BigDecimal'來獲得更高的精度或準確度! –

+1

我建議你看看「每個計算機科學家應該知道什麼是浮點運算」http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – ale64bit

回答

5

嘗試使用BigDecimal

例如:

BigDecimal base = new BigDecimal("some number"); 
int exponent = ..; 

BigDecimal result = base.pow(exponent); 
1

double的類型在Java是IEEE雙並且僅具有53位精度。因此,您將獲得最接近真實答案的double價值。

由於結果的幅度較大,最接近的double值比1分開得多。你可以通過調用Math.ulp method(最後一個單位)來驗證。

System.out.println(Math.ulp(Math.pow(myBase, myExponent))); 

此輸出:

6.7108864E7 

即使採用精度,連續double值是67000000開。

作爲替代方案,您可以使用BigDecimal來代替,例如,

BigDecimal myBase= new BigDecimal(scan.next()); 
int myExponent= scan.nextInt(); 

//displays result 
System.out.println(myBase.pow(myExponent)); 

輸出:

548815620517731830194541.899025343415715973535967221869852721 

注意pow here takes an int,不是另一個BigDecimal