“避雨到槐树底下,坐着看雨后的云霞”
前言
本来这一张是放在上篇博客(一些零散的知识点)里的
后来觉得这一部分经常用到,内容也挺多
于是就单独列一篇出来了
保留位数
分别介绍如何用 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 手册