我想找出幾種方法來保留雙精度值的兩位小數。目前,我嘗試了以下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));
}
}
}
你的意思是BigDecimal而不是BigInteger? – Thomas
是的。它關於java.math.BigDecimal而不是java.math.BigInteger。 – MouseLearnJava