Java 保留小数位数的方法主要有NumberFormat,Decimalformat,BigDecimal, 以及格式化输出等。下面我们来看一下这几种方法的具体写法。
NumberFormat
double a = 223.121233333;
NumberFormat numberFormat = NumberFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(5);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(numberFormat.format(a));
Decimalformat
Decimalformat是NumberFormat的子类,拥有更加强大的解析和格式化能力。支持不同类型的数字,比如整形(123),固定位数(123.1), 科学计数法(1.23E4), 百分数(12%),以及货币数量($123),这些类型都可以做本地化。我们简单的看一下如何保留小数位数:
DecimalFormat df = new DecimalFormat("#.######");
df.setRoundingMode(RoundingMode.HALF_UP);
格式: #.###### 最多保留6位小数
#.000000, 保留6位,不足用0填充
BigDecimal
double b = new BigDecimal(a).setScale(6, RoundingMode.HALF_UP).doubleValue();
格式化输出:%.2f
String aaa = String.format("%.6f", a);
性能测试
static void testNumberFormat() {
long start = System.currentTimeMillis();
double a = 124555.15678905678;
NumberFormat numberFormat = NumberFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(5);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
for (int i = 0; i < 1000; i ++) {
String aaa = numberFormat.format(a);
}
long end = System.currentTimeMillis();
System.out.println("testNumberFormat cost time: " + (end - start));
}
static void testDecimalFormat() {
long start = System.currentTimeMillis();
double a = 124555.15678905678;
DecimalFormat df = new DecimalFormat("#.######");
df.setRoundingMode(RoundingMode.HALF_UP);
for (int i = 0; i < 1000; i ++) {
String aaa = df.format(a);
}
long end = System.currentTimeMillis();
System.out.println("testDecimalFormat cost time: " + (end - start));
}
static void testBigDecimal() {
long start = System.currentTimeMillis();
double a = 124555.15678905678;
for (int i = 0; i < 1000; i ++) {
double b = new BigDecimal(a).setScale(6, RoundingMode.HALF_UP).doubleValue();
}
long end = System.currentTimeMillis();
System.out.println("testBigDecimal cost time: " + (end - start));
}
static void testStringFormat() {
long start = System.currentTimeMillis();
double a = 124555.15678905678;
for (int i = 0; i < 1000; i ++) {
String aaa = String.format("%.6f", a);
}
long end = System.currentTimeMillis();
System.out.println("testStringFormat cost time: " + (end - start));
}
测试输出:
testNumberFormat cost time: 58
testDecimalFormat cost time: 16
testBigDecimal cost time: 27
testStringFormat cost time: 65
显然,DecimalFormat,BigDecimal都比较快,我们实际上使用时,可以采用这两个。