2012-07-28 172 views
1
String phrase = "4556.44"; 
Float num = new Float(phrase); 
int dollars = (int) Math.floor(num); 
System.out.println(""+dollars); 
int cent = (int) Math.floor((num - dollars) * 100.0F); 
int cent2 = (int) ((num - dollars) * 100.0); 
System.out.println(""+cent+":"+cent2); 

這是一個數字到Word類代碼短語,我的問題是當我運行這段代碼時輸出結果是4556.43。但輸入值是4556.44。請告訴我爲什麼會發生這種情況,我需要正確解決這個問題的答案。這段代碼有什麼問題?

回答

0
int cent = (int)(num * 100f % 100f); 
+0

嗨,謝謝你的一切。你的代碼正在爲我工​​作謝謝你。三寶石保佑你 – 2012-07-28 10:29:52

2

對於高精度計算具有受控的舍入使用BigDecimal代替Float

1

浮標比雙打其比BigDecimal的不太精確的不太精確的。

使用絕對必須精確的程序(如財務應用程序)時,請使用BigDecimal。

如果這是一個小功課和非關鍵的應用程序,您可以嘗試Double來查看它是否足夠精確。

+1

我相信當你說你長的雙重意思。 – SiB 2012-07-28 10:24:46

+0

是的,感謝您的更正 – 2012-07-28 14:08:11

0

Float不是精確計算的好選擇。

int cent = (int) Math.floor((num - dollars) * 100.0F); 

上面的代碼中的語句並不完全給你準確的答案,如你所期望的。

如果可能,請嘗試使用DoubleBigInteger

0

浮動和雙打不能代表所有可能的實數,因爲它們使用了一個specification,它通過添加以下任意數字構成數字:1,1/2,1/4,1/8,1/16等。 ..

如果你嘗試了0.1f+0.1f+0.1f==0.3f,你會得到錯誤的。所以,正如其他人所說的那樣,使用BigDecimal,它使用了不同的表示方法,但速度要慢得多,但不會產生這些問題。

0

你也可以做以下

String phrase = "4556.44"; 
long money = Math.round(Double.parseDouble(phrase) * 100); 
long dollars = money/100; 
long cents = money % 100; 
System.out.printf("%,d dollars and %d cents%n", dollars, cents); 

打印

4,556 dollars and 44 cents