Java保留小数位

Math.round(), BigDecimal, DecimalFormat的认识

Posted by BlackDn on September 25, 2019

“避雨到槐树底下,坐着看雨后的云霞”

前言

本来这一张是放在上篇博客(一些零散的知识点)里的
后来觉得这一部分经常用到,内容也挺多
于是就单独列一篇出来了

保留位数

分别介绍如何用 Math.round(), BigDecimal, DecimalFormat 保留位数

Math.round()

Math.round()可以对小数进行“四舍五入”,在参数上加 0.5 然后进行下取整,返回的时整数

Math.round(1.5);    //返回值是2
Math.round(-1.5);    //返回值是-1

实际上 Math.round()存在方法重载,为了保证精度不丢失,一个接收 float 类型返回 int 类型,另一个接收 double 类型返回 long 类型

BigDecimal

使用时,先实例化其对象,并传入相应的值进行实例化,这个值可为 double,也可为 String
BigDecimal 的对象间的运算不能简单的进行加减乘除,必须调用其对应的方法

BigDecimal b1 = BigDecimal.valueOf(value1);

示例如下

    public static void main(String[] args) {
        BigDecimal bigDecimal = BigDecimal.valueOf(2.0358);
        System.out.println("print BigDecimal: " + bigDecimal);
    }
//运行结果
print BigDecimal: 2.0358

利用setScale()方法用于格式化小数点,可以实现四舍五入。它接收两个参数,第一个表示保留小数位数,第二个参数若不传则默认四舍五入,也可传入以下值:

1. BigDecimal.ROUND_HALF_UP表示四舍五入
2. BigDecimal.ROUND_HALF_DOWN也是五舍六入
3. BigDecimal.ROUND_UP表示进位处理(就是直接加1)
4. BigDecimal.ROUND_DOWN表示直接去掉尾数

示例如下

    public static void main(String[] args) {
        BigDecimal bigDecimal = BigDecimal.valueOf(2.0358);
        double d = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println("print BigDecimal: " + d);
    }
//运行结果
print BigDecimal: 2.04

但是我的 IDEA 会显示xxx is deprecated,于是我去查了 Java 文档,在 Java SE 10 & JDK 10 及以上中,将这些移除了,要用以下替换。

Field Description
ROUND_HALF_UP Deprecated,Use RoundingMode.HALF_UP instead
ROUND_HALF_DOWN Deprecated,Use RoundingMode.HALF_DOWN instead
ROUND_UP Deprecated,Use RoundingMode.UP instead
ROUND_DOWN Deprecated,Use RoundingMode.DOWN instead

不过我是 Java8 所以没有影响
Java 文档

DecimalFormat

DecimalFormat 能方便地将数字进行格式化,通常用 0 和#作为占位符进行格式设定
format 中,0.000 和#.###的区别是,如果小数部分不足 3 位,前者会用 0 补足,而后者不会

    public static void main(String[] args) {
        double test = 3.56;
        DecimalFormat decimalFormat1 = new DecimalFormat("0");   //四舍五入取整
        DecimalFormat decimalFormat2 = new DecimalFormat("0.000");  //四舍五入保留三位小数,不足用0补位
        DecimalFormat decimalFormat3 = new DecimalFormat("00.000");     //四舍五入保留两位整数+三位小数。不足用0补位
        DecimalFormat decimalFormat4 = new DecimalFormat("#.000");   //四舍五入保留所有整数+三位小数,小数不足用0补位
        DecimalFormat decimalFormat5 = new DecimalFormat("#");      //四舍五入保留所有整数
        DecimalFormat decimalFormat6 = new DecimalFormat("#.###");   //四舍五入保留所有整数和小数,不足不补位
        DecimalFormat decimalFormat7 = new DecimalFormat("#.##%");      //有%会自动变成百分数
        DecimalFormat decimalFormat8 = new DecimalFormat("##.##E0");     //科学计数法,显示两个整数,保留两位小数
        DecimalFormat decimalFormat9 = new DecimalFormat(",###");      //每三位逗号分隔

        System.out.println("format 0: " + decimalFormat1.format(test));
        System.out.println("format 0.000: " + decimalFormat2.format(test));
        System.out.println("format 00.000: " + decimalFormat3.format(test));
        System.out.println("format #.000: " + decimalFormat4.format(test));
        System.out.println("format #: " + decimalFormat5.format(test));
        System.out.println("format #.##: " + decimalFormat6.format(test));
        System.out.println("format #.##%: " + decimalFormat7.format(test));
        System.out.println("format ##.##E0: " + decimalFormat8.format(test));
        System.out.println("format .###: " + decimalFormat9.format(test));
    }
//运行结果
format 0: 4
format 0.000: 3.560
format 00.000: 03.560
format #.000: 3.560
format #: 4
format #.##: 3.56
format #.##%: 356%
format ##.##E0: 3.56E0
format .###: 4

更多地占位符及其作用可以参考 Java SE8 手册中的部分
Java SE8 手册