什麼是將美元換算成雙值的最好方法是將美分轉換爲Java中的整數值。目前我使用以下方法:在Java中將美元兌換爲美分的最準確方法是什麼
Double cents = new Double(dollar*100);
int amount = cents.intValue();
這種方法有多準確?有沒有更好的方法來做到這一點。
什麼是將美元換算成雙值的最好方法是將美分轉換爲Java中的整數值。目前我使用以下方法:在Java中將美元兌換爲美分的最準確方法是什麼
Double cents = new Double(dollar*100);
int amount = cents.intValue();
這種方法有多準確?有沒有更好的方法來做到這一點。
既然你已經把你的價值放在了一倍,你已經引入了一些不準確:你存儲的數字可能並不完全是你想存儲的值。爲了解決這個問題,我建議將它舍入到最接近的分數。您可以使用Math.round
:
int cents = (int) Math.round(100*dollars);
BigDecimal想法也可以工作,但只能用強制MathContext才能獲得整數精度和舍入到最近。這是一個更直接的解決方案。 –
與大多數情況一樣,「取決於」。這取決於你的確切情況以及你的程序正在解決的問題空間。你設計的雙打和漂浮方法看起來很好。然而,就金錢而言,許多人和圖書館只選擇整數數學。在高精度和高精度至關重要的情況下,這名義上將舍入誤差最小化。爲自己和你的用例進行評估是否有效。
同時,將思考過程應用於您的案例,您可能只需使用美分並僅爲演示文稿進行轉換。或者,更好的是,封裝邏輯在貨幣類,或許美元類:
int amountInCents = ....
int amountInDollars = round(amountInCents/100.0);
注意使用明確的小數的告訴編譯器,以避免整數除法。精明的人會相應地看到這個代碼中隱藏的浮點數學。
這是支持answer recommending rounding。該程序將四捨五入的結果與問題中的截斷代碼進行比較以獲得一系列值。它使用BigDecimal算術來生成值,避免循環中的累積舍入誤差。如果舍入和截斷的結果不同,它會打印數字。
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
BigDecimal rawDollar = BigDecimal.ZERO;
BigDecimal increment = new BigDecimal("0.01");
for (int i = 0; i < 300; i++) {
rawDollar = rawDollar.add(increment);
double dollar = rawDollar.doubleValue();
Double cents = new Double(dollar * 100);
int amount = cents.intValue();
int roundedAmount = (int) Math.round(dollar * 100);
if (amount != roundedAmount) {
System.out.println("dollar = " + dollar + " amount = " + amount
+ " rounded = " + roundedAmount);
}
}
}
}
這是輸出。在每個印刷的案例中,四捨五入的數量是正確的,截斷的數量比它應該小一個百分點。
dollar = 0.29 amount = 28 rounded = 29
dollar = 0.57 amount = 56 rounded = 57
dollar = 0.58 amount = 57 rounded = 58
dollar = 1.13 amount = 112 rounded = 113
dollar = 1.14 amount = 113 rounded = 114
dollar = 1.15 amount = 114 rounded = 115
dollar = 1.16 amount = 115 rounded = 116
dollar = 2.01 amount = 200 rounded = 201
dollar = 2.03 amount = 202 rounded = 203
dollar = 2.05 amount = 204 rounded = 205
dollar = 2.07 amount = 206 rounded = 207
dollar = 2.26 amount = 225 rounded = 226
dollar = 2.28 amount = 227 rounded = 228
dollar = 2.3 amount = 229 rounded = 230
dollar = 2.32 amount = 231 rounded = 232
dollar = 2.51 amount = 250 rounded = 251
dollar = 2.53 amount = 252 rounded = 253
dollar = 2.55 amount = 254 rounded = 255
'int amount =(int)(double * 100)'? – geisterfurz007
你最好沒有「雙重」價值開始。 – khelwood
@khelwood,我現在無法更改dayatypes –