java 几种保留小数位数的方法性能比较

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都比较快,我们实际上使用时,可以采用这两个。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值