2012-04-26 102 views
0

因此,我目前正在閱讀一本關於學習java的書,本書中概述的一個程序給了我一些麻煩。具體來說,當我運行程序來計算美元的金額和9.87應該有的變化時,我得到的結果會改變,就像我輸入9.86一樣。但是,當我輸入9.86時,我得到正確的變化量。據我所知,這隻會發生在一些以.87結尾的數量上,如8.87,儘管它可以用於6.87的罰款。這是java編程第8版的書介紹,由於它是一本由專業人士編寫的書,我很困惑這個錯誤是什麼。我曾嘗試在cmd和eclipse中運行它,兩者都顯示錯誤。程序邏輯錯誤

引擎收錄鏈接:

http://pastebin.com/CVssSUYp

+0

閱讀float到int轉換。簡單的演員截斷(向下舍入)。你想要一個「圓到最近」的轉換。也就是說:'int remainingAmount =(int)((amount + 0.005)* 100);' – 2012-04-26 19:25:53

回答

5

,我幾乎可以肯定,你被點編號如何浮動工作缺乏瞭解咬傷。你不能再用二進制表示0.1,而用十進制表示1/3。然後,除此之外,IEEE浮點數的雙精度數不能超過17位。

這不是Java或您的代碼中的錯誤。

錢是一個不應該用十進制數表示的東西的典型例子。

寫整數美元和美分Money類和使用,當你掌握足夠的Java:

public class Money { 
    private final int dollars; 
    private final int cents; 
    private final Currency currency; 

    public Money(int dollars, int cents, Currency curr) { 
     if (dollars < 0) throw new IllegalArgumentException("dollars cannot be negative"); 
     if (cents < 0) throw new IllegalArgumentException("cents cannot be negative"); 
     if (curr == null) throw new IllegalArgumentException("currency cannot be null"); 
     this.dollars = dollars; 
     this.cents = cents; 
     this.currency = curr; 
    } 
    // more methods here. 
} 
+0

好的,謝謝你的清理。澄清當我說「概述」時,我的意思是這本書的確切代碼。我想他沒有詳細說明爲什麼像9.87這樣的數字不起作用,因爲他不想混淆或者稍後他會提及它,無論如何非常感謝你。 – Andrew 2012-04-27 00:33:11

0

duffymo是正確的。浮點數爲9.87 x 100可能爲986.999999999 ...,當轉換爲整數時,它將轉換爲986。

您可以在使用(int)將浮點四捨五入到最接近的整數之前使用Math.round()進行類型轉換。

import java.lang.Math; 
... 
int remainingAmount = (int)(Math.round(amount * 100)); 
... 

產生正確的輸出:

Your amount 9.87 consists of 
     9 dollars 
     3 quarters 
     1 dimes 
     0 nickels 
     2 pennies 

問候,

曼尼

0

嘗試用100設置金額以9.87和然後乘以它:

double amount=9.87; 
System.out.println(amount*100); 

後那試試打印同樣的事情,但它轉換成int:

double amount=9.87; 
System.out.println((int)amount*100); 

鑄造爲int只是刪除在最後的小數(如熱舔在註釋中說的)因爲你不能代表浮點數準確(如duffymo在回答中說)你最終會得到986而不是你所期望的987。