2016-04-29 34 views
0

這裏就是我們所嘗試,但那些事非的作品...變化6.51 6.50在Java的BigDecimal

BigDecimal Total_Discount=new BigDecimal(10.00); 
    BigDecimal Amount_To_User=new BigDecimal(00.00); 
    BigDecimal Amount_To_Me=new BigDecimal(00.00); 



    Amount_To_User=Total_Discount.multiply(new BigDecimal(0.65)).setScale(2,BigDecimal.ROUND_UP); //65% of the amount 
    Amount_To_Me=Total_Discount.multiply(new BigDecimal(0.35)).setScale(2,BigDecimal.ROUND_UP); //35% of the amount 

由65%和35分割數值,以便10將是6.50和3.50,但我正在使用BigDecimal.DOWN我得到6.50我已經有6.51,我需要改變,以6.50

Amount_To_User=Amount_To_User.setScale(2, BigDecimal.ROUND_CEILING); 
    System.out.println(Amount_To_User); //Gives the value 6.51 

我想改變這種狀況6.51 6.50值越來越6.51但這並不工作

+1

如果您想分割金額,您最好只計算一個乘以乘數的值,另一個乘以總賬戶的相減值。在這種情況下,滿足公式'total = am_user + am_me'。 – Robert

+0

請勿使用浮點值作爲Bigdecimal的值。使用整數或字符串,例如'valueOf(int)'或'new BigDecimal(string)'。如果您想要BigDecimals提供的準確性,請遠離浮點。 –

回答

4

TL; DR:使用BigDecimal.ROUND_HALF_UP作爲舍入模式和/或使用字符串作爲輸入而不是double來創建BigDecimal。

Explenation

比較的文檔。這裏是你想要的東西:

BigDecimal.ROUND_HALF_UP

舍入模式走向「近鄰」,除非雙方 的距離相等,在這種情況下圍捕。如果廢棄部分≥0.5,則表現爲 ROUND_UP;否則,表現爲 ROUND_DOWN。 請注意,這是我們大多數人 在小學授課的舍入模式。

VS.你用過什麼。

BigDecimal.ROUND_CEILING(在你的情況下的行爲像BigDecimal.ROUND_UP,見下文)

舍入模式接近正無窮大。如果BigDecimal爲 爲正,則表現爲ROUND_UP;如果爲負值,則表現爲 ROUND_DOWN。請注意,這個舍入模式永遠不會減少計算值 。

你總是收起來。並且您有一個帶小數點的數字,因爲您使用double作爲Input來創建BigDecimal(請參閱下面的示例)。

BigDecimal.ROUND_UP

入模式從零往返路程。在非零廢棄分數之前,始終遞增數字 。請注意,該舍入模式 絕不會降低計算值的大小。

此外,您應該從字符串輸入而不是從double創建BigDecimals。對構造函數中的值使用引號"

BigDecimal total_Discount = new BigDecimal("10.00"); 
BigDecimal amount_To_User = new BigDecimal("00.00"); 
BigDecimal amount_To_Me = new BigDecimal("00.00"); 

amount_To_User = total_Discount.multiply(new BigDecimal("0.65")).setScale(2, BigDecimal.ROUND_HALF_UP); 
amount_To_Me = total_Discount.multiply(new BigDecimal("0.35")).setScale(2, BigDecimal.ROUND_HALF_UP); 
System.out.println(amount_To_User); //6.50 
System.out.println(amount_To_Me); //3.50 

這會告訴你爲什麼:

System.out.println(new BigDecimal(0.65)); 
//prints 0.65000000000000002220446049250313080847263336181640625 
System.out.println(new BigDecimal("0.65")); 
//prints 0.65 

絕處逢生還沒有一個完美的精度在每一個十進制數,而字符串中有它。

+0

這是一個關於絃樂和雙打的有趣評論。我很好奇是否還有性能因素?該字符串只是給你數字,而Double似乎實際上執行某種操作來將Double轉換爲BigDecimal,這看起來好像一個字符串會更快......我想知道這是否是很多事情的情況。 – XaolingBao