2013-10-27 77 views
0

我想找出幾種方法來保留雙精度值的兩位小數。目前,我嘗試了以下5種方法。java.math.BigDecimal並不總是用於保留兩位小數?

  • 使用java.math.BigDecimal的
  • 使用java.text.DecimalFormat中
  • 使用java.text.NumberFormat中
  • 使用的java.util.Formatter
  • 使用的String.format

這5種方法的結果基本一致。但是,在某些情況下,java.math.BigDecimal與其他4種方法有不同的結果。

採取雙重價值100.0050D例如:

它使用java.math.BigDecimal的時候在我的代碼返回100.00。但其他4種方法返回100.01。結果不一致。

實際上,使用了RoundingMode.HALF_UP。這裏來我的問題:

有沒有什麼我錯過了使用java.math.BigDecimal在我的代碼下面保留兩個小數位的double值?

還是在類java.math.BigDecimal中的一個小缺陷?

請幫我解決這個問題。先謝謝你。

此外,我不確定它在各種JDK版本中是否有所不同,只是提供了我使用的JDK版本爲1.7.0_25的信息。

代碼如下:

public final class PrecisionTest { 

    private PrecisionTest() { 
    } 

    public static String format1(double value) { 

     BigDecimal bd = new BigDecimal(value); 
     bd = bd.setScale(2, RoundingMode.HALF_UP); 
     return bd.toString(); 
    } 

    public static String format2(double value) { 

     DecimalFormat df = new DecimalFormat("0.00"); 
     df.setRoundingMode(RoundingMode.HALF_UP); 
     return df.format(value); 
    } 

    public static String format3(double value) { 

     NumberFormat nf = NumberFormat.getNumberInstance(); 
     nf.setMaximumFractionDigits(2); 
     nf.setMinimumFractionDigits(2); 
     nf.setRoundingMode(RoundingMode.HALF_UP); 
     nf.setGroupingUsed(false); 
     return nf.format(value); 
    } 

    public static String format4(double value) { 
     return new Formatter().format("%.2f", value).toString(); 
    } 

    public static String format5(double value) { 

     return String.format("%.2f", value).toString(); 
    } 
} 

簡單測試代碼如下:

public class Main { 

    public static void main(String[] args) { 

     double[] testData = new double[] { 100.123D, 1234567.897D, 100.0050D, 
       80.0051D,-100245.3658D}; 

     for (double value : testData) { 
      System.out.println(PrecisionTest.format1(value)); 
      System.out.println(PrecisionTest.format2(value)); 
      System.out.println(PrecisionTest.format3(value)); 
      System.out.println(PrecisionTest.format4(value)); 
      System.out.println(PrecisionTest.format5(value)); 
     } 
    } 
} 
+1

你的意思是BigDecimal而不是BigInteger? – Thomas

+0

是的。它關於java.math.BigDecimal而不是java.math.BigInteger。 – MouseLearnJava

回答

4

的100.005雙表示不是精確的,並且略小於100.005:

scala> new java.math.BigDecimal(100.0050) 
res0: java.math.BigDecimal = 100.0049999999999954525264911353588104248046875 

因此,當您設置縮放和舍入模式時,它會舍入到100.00。

在另一方面,使用一個字符串構建一個BigDecimal按預期方式工作:

scala> new java.math.BigDecimal("100.0050") 
res2: java.math.BigDecimal = 100.0050 

scala> res2.setScale(2, java.math.RoundingMode.HALF_UP).toString 
res3: java.lang.String = 100.01 
+0

感謝您的回答。 – MouseLearnJava

2

雙[] TESTDATA =新雙[] {100.123D,1234567.897D,100.0050D,
80.0051 d,-100245.3658D};

問題在這裏。與BigDecimal完全無關。這些數字不能用浮點精確表示。嘗試從初始化您的BigDecimal字符串表示值。

+0

感謝您的信息。 – MouseLearnJava

相關問題