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转换

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。