2012-07-24 92 views
0

如果變量直接輸入(即(5.00,20.00),它完美地計算出的變化,但如果我購買替代值和金額不計算變化?Java的替代變量

public static void makeChange() 
    { 

     double purchase; 
     double tendered; 

     Scanner scan = new Scanner (System.in); 

     System.out.println ("How much was the Purchase?"); 
     purchase = scan.nextDouble(); 
     System.out.println ("Amount Tendered"); 
     tendered = scan.nextDouble(); 


     System.out.println("Processing Transaction"); 
     int ch[] = cd.makeChange(purchase, tendered); // does not calculate change correctly 





      ...continued 
+1

你得到一個錯誤或只是錯誤的結果?你能告訴我們'makeChange(double,double)'方法嗎? – Keppil 2012-07-24 07:59:38

+0

只是錯誤的結果,一切都變成了零 – 2012-07-24 08:01:08

+2

嘗試打印'purchase'和'tendered',看看它們是否包含你認爲的值。 – Keppil 2012-07-24 08:02:08

回答

3

您正在使用使用double,將盡快產生不可預知的結果作爲任何中間值是不能被double準確表示了一些算術和比較例如,考慮這個無辜的前瞻性循環:

double value = 1.0; 
double dime = 0.1; 
while (value > 0) { 
    value -= dime; 
    System.out.println(value); 
} 

Thi s打印:

0.9 
0.8 
0.7000000000000001 
0.6000000000000001 
0.5000000000000001 
0.40000000000000013 
0.30000000000000016 
0.20000000000000015 
0.10000000000000014 
1.3877787807814457E-16 
-0.09999999999999987 

有關爲什麼這樣的情況的進一步閱讀可以在這裏找到:What Every Computer Scientist Should Know About Floating-Point Arithmetic

正如您在上一個問題中所建議的,將您的double變量更改爲BigDecimal s,我認爲您的問題將消失。

+0

我會閱讀那篇文章,謝謝。 – 2012-07-24 08:19:59

+0

有沒有一個原因BigDecimal不能作爲一個標識符,當double呢? – 2012-07-24 08:26:27

+1

它以什麼方式不起作用?你的程序應該使用'BigDecimal's,甚至有''Scanner'的nextBigDecimal()'方法。 – Keppil 2012-07-24 08:31:54