2014-09-23 225 views
2

我是java的新手,我正在爲每月付款計算器編寫一個代碼,唯一的問題是我收到的四捨五入錯誤。我需要計算,我做到了由每月支付:使用%.2f的Java小數點

System.out.printf("Your monthly payment will be:$%.2f", payment); 

這部分是走出來確定

現在我必須找出多少,他們將在他們的付款月底支付,所以我做:

System.out.printf("You will be paying a total amount of $%.2f", payment * months); 

這是我的問題在於,在首次印出它捨去了支付,在第二打印出其四捨五入支付時代的幾個月裏,我需要它來圓只有付款,然後乘上幾個月,但我無法弄清楚如何。任何幫助都會很棒。

+0

嘗試'Math.round' – talex 2014-09-23 14:11:05

+0

我試過了,它將它舍入到一個整數EX:45.21 = 45.00 – 2014-09-23 14:12:51

+0

如果你深入這個檢查http://javamoney.github.io/,雖然它可能是矯枉過正;) – hovanessyan 2014-09-23 14:13:07

回答

0

你可以試試這個:

DecimalFormat df = new DecimalFormat(); 
df.setMaximumFractionDigits(2); 
double payment_rounded =Double.parseDouble(df.format(payment)); 

現在你有可變payment_rounded與2位小數的兩倍。你可以在這兩種情況下使用這個變量。

+0

非常感謝!它像一個魅力工作! – 2014-09-23 14:29:42

+0

如果有幫助,你可以接受答案! :) – 2014-09-23 14:31:05

0
System.out.printf("You will be paying a total amount of $%.2f", (Math.round((payment * 100.0))/100.0) * months); 

這應該舍入到小數點後兩位。它所做的是將小數點位置移動2個點然後移回2個點。如果你不想使用BigDecimal,這將工作,如果你仍然想使用原始類型double。

+0

獲得'double'的更簡單的方法是除以'100.0':'Math.round(payment * 100)/ 100.0'。 – Keppil 2014-09-23 14:17:26

1

使用BigDecimal而不是double。這個符號是醜陋的。使用new BigDecimal("12.34")讓BigDecimal知道精度。由於您需要像addmultiply這樣的方法,所以用法更爲醜陋。

數據庫中的BTW也使用DECIMALS,以具有固定精度,而不是浮點近似。

有原因,做一個搜索。

+0

真的很遺憾,你實際上沒有給出原因。如果你有的話,你會收到我的讚賞。 – 2014-11-07 00:10:18

+0

@DavidWallace謝謝,下次(肯定會來)我會找到一個更詳細的答案,或者自己闡述。 – 2014-11-07 11:15:08