2013-10-03 69 views
-3

有沒有人有我的輸出問題的想法?奇怪的Java輸出 - 用Eclipse在Mac獅子上運行虛擬機

我已經編寫了一個Java程序,並使用Eclipse在Mac lion上的VM上運行它。 代替1.41,我在我的機器上得到了1.4100000000000001

Example: 
Enter the number of quarter: 4 
Enter the number of dimes: 3 
Enter the number of nickels: 2 
Enter the number of pennies: 1 

Total $1.4100000000000001 

Example: 
Enter the number of quarter: 3 
Enter the number of dimes: 2 
Enter the number of nickels: 1 
Enter the number of pennies: 6 

Total $1.06 

Example: 
Enter the number of quarter: 5 
Enter the number of dimes: 7 
Enter the number of nickels: 4 
Enter the number of pennies: 4 

Total $2.1900000000000004 

有時出現輸出正確,而其他時間有問題。

代碼:

import java.util.*; 

public class CountChange 
{ 
    public static void main(String[]args) 
    { 
     Scanner inputScanner = new Scanner(System.in); 
     System.out.print("Enter the number of quarters: "); 
     int quarters = inputScanner.nextInt(); 
     System.out.print("Enter the number of dimes: "); 
     int dimes = inputScanner.nextInt(); 
     System.out.print("Enter the number of nickles: "); 
     int nickles = inputScanner.nextInt(); 
     System.out.print("Enter the number of pennies: "); 
     int pennies = inputScanner.nextInt(); 
     inputScanner.close(); 

     double total =0.00; 
     total = quarters * 0.25 + dimes * 0.1 + nickles * 0.05 + pennies * 0.01; 

     System.out.println("Total $" + total); 
     System.out.print("Thank you"); 
    } 
} 
+1

http://floating-point-gui.de/ –

+0

如果您使用浮點數,則需要舍入結果。嘗試'System.out.printf(「$%。2f%n「,value);' –

回答

2

你的問題涉及到如何浮點(放容易,float/double相關的計算)發生。浮點數是一個近似的表示(如果您對後面的理論感興趣,則標準爲IEEE754)。在這裏,你正在得到一個近似的表示。由於您正在處理的貨幣只能到美分(您不能有0.0001美元的貨幣),所以我建議用int(或longlong或任何整數類型)值代表價值爲美分。然後,顯示結果時除以100。

+0

我的一些安全價格是以$ .0001單位報價的,程序員應該提防假設 –

+0

OP正在處理* real * currency(quarter,dimes等)。例如0.0001美元硬幣 –

+0

程序員應該小心假設 –

1

您已經體驗到將浮點數字表示爲double s的不精確性。數字0.1不能完全用二進制表示,所以當你用Java語言表示0.1時,可以得到最接近0.1的近似值。同樣的事情適用於0.050.01

有幾件事情可以做:

  • 推遲浮點運算,只要可能的。

實施例:

total = quarters * 25 + dimes * 10 + nickles * 5 + pennies; 
total /= 100.0; 

例子:

DecimalFormat df = new DecimalFormat("0.00"); 
System.out.println("Total $" + df.format(total)); 

無論這些變通辦法得到周圍的基本問題 - 由double一些不精確的表示。特別是對於金額,不要使用double。您甚至可以使用BigDecimal來代替,其精度是任意的。

0

我同意你爲什麼遇到這個問題的解釋。我在Java中推薦的解決方案是使用BigDecimal。它確實完成了那些你認爲精確的短小數部分的計算。對於不精確的計算,它提供了一個很好的舍入方法選擇。

實際上,它使用比例因子進行整數運算,但會自動存儲和管理比例。

+0

非常感謝您的所有投入,讚賞它。 – user2844217