首页 > 代码库 > Java 保留两位小数

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.143.143.143.143.143.14

4.015:

4.014.024.014.024.014.01

4.016:

4.024.024.024.024.024.02

999999999.015:

9.9999999901E89.9999999902E8999999999.01999999999.02999,999,999.019.9999999902E8

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

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

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

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

①BigDecimal,字符串构造

②String.format转换

 

Java 保留两位小数