2009-05-25 61 views
14

我在計算一個百分比「因子」。也就是說,給定20%,將其轉換爲0.2(我的意圖是稍後將值乘以該值並獲得20%的值)。Java,BigDecimal。分區問題

無論如何,問題是用這段代碼相關:

public static void main(String[] args) { 
    int roundingMode = BigDecimal.ROUND_FLOOR; 
    BigDecimal hundred = new BigDecimal("100"); 
    BigDecimal percentageFactor = null; 
    BigDecimal percentage = new BigDecimal("20"); 
    BigDecimal value = new BigDecimal("500"); 
    percentageFactor = percentage.divide(hundred, roundingMode); 
    float f = percentage.floatValue()/hundred.floatValue(); 
    f = value.floatValue() * f; 
    BigDecimal aux = value.multiply(percentageFactor); 
    System.out.println("factor:"+percentageFactor.toString()); 
    System.out.println("final falue:"+aux.toString()); 
    System.out.println("Float Value:"+f);  
} 

我希望這樣做的結果是這樣的:

factor: 0.2 
final value: 100 
float value: 100 

而是percentage.divide(hundred, roundingMode);將返回零,一因此我得到:

factor:0 
final falue:0 
Float Value:100.0 

我在做什麼錯?我怎樣才能正確地分兩位大數小數?

順便說一句,我使用BigDecimal,因爲我會計算貨幣百分比,所以我想控制四捨五入。

回答

9

new BigDecimal("20")規模爲零,因爲你有沒有小數點在那裏。這意味着您的percentage.divide(hundred, BigDecimal.ROUND_FLOOR)將產生零(實際上是int(20/100)0)。

如果你真的想做分數的東西,請使用new BigDecimal("20.00"),以便正確設置比例尺,或者使用其他構造函數之一來專門設置比例尺。

下面是從20簡單改變輸出20.00,完成您的spellink misteak :-)

factor:0.20 
final falue:100.00 
Float Value:100.0 
13

我認爲,最好的解決辦法是將時設置的請求的比例:在這種情況下也許2.

BigDecimal hundred = new BigDecimal(100); 
    BigDecimal percentage = new BigDecimal(20); 
    BigDecimal value = new BigDecimal(500); 
    BigDecimal percentageFactor = 
       percentage.divide(hundred,2, BigDecimal.ROUND_HALF_UP); 

    value = value.multiply(percentageFactor); 
    System.out.println("final value:"+ value); 

最終值100.00

(乘法使用從因素(0 + 2)的比例,但它可以b e)

我會使用HALF_UP進行會計覈算(在我的立法中)或偶數(統計)舍入模式。

0

float只有6位數的精度,幾乎從來都不是一個好的選擇,我建議你用double來代替。 (或BigDecimal在某些情況下可能會更好)

+0

如果要控制舍入,則根本不應使用浮點數,既不是浮點數也不是double。堅持BigDecimal。 – markusk 2009-05-25 19:03:23