1. 程式人生 > >JAVA BigDecimal的相加 丟失精度問題

JAVA BigDecimal的相加 丟失精度問題

在處理BigDecimal 物件的 數值相加的問題上遇到麻煩,借鑑了 JAVA BigDecimal的相加 的文章,但是依然沒有解決我的問題
其文章分析如下(純屬借鑑!)

程式碼如下:

[java]  view plain  copy
  1. BigDecimal totalAmount = new BigDecimal(0);  
  2.         totalAmount.add(new
     BigDecimal(5000));  
  3.         System.out.println(totalAmount);  


輸出結果為0。

查資料後才知道,要這樣寫才行:

[java]  view plain  copy
  1. BigDecimal totalAmount = new BigDecimal(
    0);  
  2.         totalAmount = totalAmount.add(new BigDecimal("5000"));  
  3.         System.out.println(totalAmount);  


同時,在new一個BigDecimal物件的時候,最好傳入字串或者int型別的數字,因為傳入double型別的數字會有很神奇的事情發生,

比如說:

[java]  view plain  copy
  1. BigDecimal totalAmount = new BigDecimal(0);  
  2.         totalAmount = totalAmount.add(new BigDecimal(0.59));  
  3.         System.out.println(totalAmount);  

輸出結果:

0.58999999999999996891375531049561686813831329345703125

但是如果傳入的是String型別的數字:

[java]  view plain  copy
  1. BigDecimal totalAmount = new BigDecimal(0);  
  2.         totalAmount = totalAmount.add(new BigDecimal("0.59"));  
  3.         System.out.println(totalAmount);  

輸出結果:

0.59


上自己的:


BigDecimal productAmount = new BigDecimal(20);
		BigDecimal taxAmount = new BigDecimal(2.38);
		BigDecimal shippingAmount = new BigDecimal(0);
		
		BigDecimal totalAmount = new BigDecimal(0);
		totalAmount = totalAmount.add(new BigDecimal("" + productAmount.toString()));
		totalAmount = totalAmount.add(new BigDecimal("" + taxAmount.toString()));
		totalAmount = totalAmount.add(new BigDecimal("" + shippingAmount.toString()));
		
		String priceVal = new java.text.DecimalFormat("######0.00")
                .format(totalAmount.setScale(2, BigDecimal.ROUND_UP).doubleValue());

		System.out.println(priceVal.toString());

這樣寫就完美的解決了我自己的問題!


詳細請參照此文:BigDecimal 的那些坑事兒