Java 保留两位小数

在实际项目开发中,经常会存在浮点数四舍五入保留几位小数的问题,故收集了几种常用方法:

直接上代码(保留两位小数)。

Format.java:

import java.math.BigDecimal;

import java.text.DecimalFormat;

import java.text.NumberFormat;



class Format {

    private double src_num;

    

    public Format(double num){

        src_num = num;

    }

    

    /*

     * BigDecimal,数字构造

     */

    public void fun1() {

        BigDecimal bg = new BigDecimal(src_num);

        //数字2代表保留两位

        double des_num = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

        System.out.println(des_num);

    }

    

    /*

     * BigDecimal,字符串构造

     */

    public void fun2() {

        BigDecimal bg = new BigDecimal(String.valueOf(src_num));

        //数字2代表保留两位

        double des_num = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

        System.out.println(des_num);

    }

    

    /*

     * DecimalFormat

     */

    public void fun3() {

        //#.00 表示两位小数 ,#.0000四位小数 以此类推...

        DecimalFormat df = new DecimalFormat("#.00");

        System.out.println(df.format(src_num));

    }

    

    /*

     * String.format

     */

    public void fun4() {

        //%. 表示 小数点前任意位数,2 表示两位小数,格式后的结果为f 表示浮点型

        System.out.println(String.format("%.2f", src_num));

    }

    

    /*

     * NumberFormat

     */

    public void fun5() {

        NumberFormat nf = NumberFormat.getNumberInstance();

        //2为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的

        nf.setMaximumFractionDigits(2);

        System.out.println(nf.format(src_num));

    }

    

    /*

     * Math.round

     */

    public void fun6() {

        double des_num = (double)Math.round(src_num * 100) / 100;

        System.out.println(des_num);

    }

}

TestDemo.java:

public class TestDemo {

    public static void main(String[] args) {

        double num = 3.1415926;

        //double num = 4.015;

        //double num = 4.016;

        //double num = 999999999.015;

        Format format = new Format(num);

        format.fun1();

        format.fun2();

        format.fun3();

        format.fun4();

        format.fun5();

        format.fun6();

    }

}


让我们看下运行结果:

3.1415926

3.14

3.14

3.14

3.14

3.14

3.14

4.015:

4.01

4.02

4.01

4.02

4.01

4.01

4.016:

4.02

4.02

4.02

4.02

4.02

4.02

999999999.015:

9.9999999901E8

9.9999999902E8

999999999.01

999999999.02

999,999,999.01

9.9999999902E8

普通开发中,对计算精度要求不算太严格的话,上面的方法都适用(科学计数法转换的话会比较繁琐)。

但对于一些精度要求较高的商业运算,误差0.01就可能造成比较大的问题。
产生上述问题的原因还是在于浮点数在计算机中本来就是不精确的,参考:http://justjavac.iteye.com/blog/1073775

从上述结果中,可以看出fun2()和fun4()是始终OK的。

因此推荐两种方式进行浮点数小数位数保留:

①BigDecimal,字符串构造

②String.format转换

 

你可能感兴趣的:(java)