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

来源:互联网 发布:重返北上广 知乎 编辑:程序博客网 时间:2024/06/05 18:58

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: 58testDecimalFormat cost time: 16testBigDecimal cost time: 27testStringFormat cost time: 65

显然,DecimalFormat,BigDecimal都比较快,我们实际上使用时,可以采用这两个。

原创粉丝点击