2013-01-11 103 views
2

可能重複:
Why not use Double or Float to represent currency?數字格式

我學習Java,所以請多多包涵這樣一個簡單的問題。當給定一個計算,以計算利益,我有這樣的代碼輸入:

public double calculateTotal(double rate, int n) 
{ 
    amount = amount * Math.pow((1+rate), (n/12)); 
    return amount; 
} 

這將返回我正在尋找的答案,但不斷增加0.000000000001到年底。 我將如何解決這個問題?一位朋友建議了一種叫數字格式的東西,但我找不到解決方案。

+8

如果這是出於貨幣目的,請改用'BigDecimal'。 – Swapnil

+3

請參閱[這裏](http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency)爲什麼使用貨幣雙重不是一個好主意。 – Jonathan

+1

'n/12'是一個整數運算,所以對於'n = 1',它將爲零,而不是'1/12'。否則,'double'永遠不會100%精確。你可以使用'DecimalFormat'來表示你的數字。 – jlordo

回答

1

此問題與廣爲人知的浮點計算問題有關。

解決的辦法之一可能是使用import java.math.BigDecimal

編輯

Java不允許覆蓋運營商所以要加BigDecimal的唯一途徑š在一起是使用add方法例如(假設你的量是BigDecimal。記住,BigDecimal爲不可變的那麼無論是從calculateTotal需要返回到被分配回ammount

// you assign result to amount outside calculateTotal 
amount.add(new BigDecimal(Math.pow((1+rate), (n/12)))); 

// you assign sum to amount inside calculateTotal 
amount = amount.add(new BigDecimal(Math.pow((1+rate), (n/12)))); 
+0

我導入了java.math.BigDecimal。不用找了。所以我將一些數據類型更改爲BigDecimal,現在編譯器抱怨不允許BigDecimals添加在一起的不正確的運算符類型。 D = – cbatothinkofname

+0

@cbatothinkofname你應該看看SO上的這個問題。 [添加BigDecimal](http://stackoverflow.com/questions/1846900/addition-for-bigdecimal) – Smit

+0

輸入了最新的反饋,現在它給了我一個完全不同的答案,這是錯誤的,然後仍然給我長的小數。 – cbatothinkofname

1

由於這是之前提到的BigDecimal好選項,如果你需要更好的雙精度的精度。

有很好的方法做與BigDecimal s舍入。基本上你必須指定BigDecimal實例。看看此示例代碼:

BigDecimal decimalOne = new BigDecimal(0.1950); 
BigDecimal decimalTwo = decimalOne.setScale(2, BigDecimal.ROUND_HALF_DOWN); 
BigDecimal decimalThree = decimalOne.setScale(4, BigDecimal.ROUND_HALF_DOWN); 

System.out.println("decimalOne: " + decimalOne); 
System.out.println("decimalTwo: " + decimalTwo); 
System.out.println("decimalThree: " + decimalThree); 

的Java 7將打印這樣的事情:

decimalOne: 0.195000000000000006661338147750939242541790008544921875 
decimalTwo: 0.20 
decimalThree: 0.1950 

請注意,BigDecimal實例是不可變的,這就是爲什麼你必須的setScale分配結果新實例(decimalOne不會更改)。


在許多金融體系double s的不用於存儲貨幣信息;代替使用具有特定精度的long類型。對於精度2,值100將是1.00,122將是1.22等。該方法簡化並計算了計算結果,但對所有系統都不好。然而,爲了簡化這個問題,我不會深入探討這個問題。