public class Test {
    public static void main(String[] args) {
        double d = 756.2345566;
 
        //方法一:最简便的方法,调用DecimalFormat类
        DecimalFormat df = new DecimalFormat(".00");
        System.out.println(df.format(d));
 
        //方法二:直接通过String类的format函数实现
        System.out.println(String.format("%.2f", d));
 
        //方法三:通过BigDecimal类实现
        BigDecimal bg = new BigDecimal(d);
        double d3 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println(d3);
 
        //方法四:通过NumberFormat类实现
        NumberFormat nf = NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(2);
        System.out.println(nf.format(d));
 
    }
}

1 DecimalFormat

DecimalFormat NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

DecimalFormat df1 = new DecimalFormat("0.0"); 
DecimalFormat df2 = new DecimalFormat("#.#"); 
DecimalFormat df3 = new DecimalFormat("000.000"); 
DecimalFormat df4 = new DecimalFormat("###.###"); 
System.out.println(df1.format(12.34)); 
System.out.println(df2.format(12.34)); 
System.out.println(df3.format(12.34)); 
System.out.println(df4.format(12.34));

运行结果: 
12.3 
12.3 
012.340 
12.34  

2 String.format()

String.format()字符串常规类型格式化的两种重载方式

  • format(String format, Object… args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。
  • format(Locale locale, String format, Object… args) 使用指定的语言环境,制定字符串格式和参数生成格式化的字符串。

转换符

详细说明

示例

%s

字符串类型

喜欢请收藏

%c

字符类型

‘m’

%b

布尔类型

true

%d

整数类型(十进制)

88

%x

整数类型(十六进制)

FF

%o

整数类型(八进制)

77

%f

浮点类型

8.888

%a

十六进制浮点类型

FF.35AE

%e

指数类型

9.38e+5

%g

通用浮点类型(fe类型中较短的)

不举例(基本用不到)

%h

散列码

不举例(基本用不到)

%%

百分比类型

(%特殊字符%%才能显示%)

%n

换行符

不举例(基本用不到)

%tx

日期与时间类型(x代表不同的日期与时间转换符)

不举例(基本用不到)

String str=null;
str=String.format("Hi,%s", "小超");  
System.out.println(str);
str=String.format("Hi,%s %s %s", "小超","是个","大帅哥");            
System.out.println(str);                           
System.out.printf("字母c的大写是:%c %n", 'C');  
System.out.printf("布尔结果是:%b %n", "小超".equal("帅哥"));  
System.out.printf("100的一半是:%d %n", 100/2);  
System.out.printf("100的16进制数是:%x %n", 100);  
System.out.printf("100的8进制数是:%o %n", 100);  
System.out.printf("50元的书打8.5折扣是:%f 元%n", 50*0.85);  
System.out.printf("上面价格的16进制数是:%a %n", 50*0.85);  
System.out.printf("上面价格的指数表示:%e %n", 50*0.85);  
System.out.printf("上面价格的指数和浮点数结果的长度较短的是:%g %n", 50*0.85);  
System.out.printf("上面的折扣是%d%% %n", 85);  
System.out.printf("字母A的散列码是:%h %n", 'A');
******************************************************************
Hi,小超
Hi,小超 是个 大帅哥
字母c的大写是:C
布尔的结果是:false
        100的一半是:50
        100的16进制数是:64
        100的8进制数是:144
        50元的书打8.5折扣是:42.500000 元
上面价格的16进制数是:0x1.54p5
上面价格的指数表示:4.250000e+01
上面价格的指数和浮点数结果的长度较短的是:42.5000
上面的折扣是85%
字母A的散列码是:41

3 BigDecimal

BigDecimal.setScale()方法用于格式化小数点:

setScale(1)表示保留一位小数,默认用四舍五入的方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍

4 NumberFormat

NumberFormat 是所有数值格式的抽象基类。此类提供格式化和解析数值的接口。NumberFormat 还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么。

NumberFormat 可用于格式化和解析任何语言环境的数值。使代码能够完全独立于小数点、千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关。

NumberFormat format = NumberFormat.getInstance();
format.setMinimumFractionDigits( 3 );
//setMinimumFractionDigits(int) 设置数值的小数部分允许的最小位数。 
format.setMaximumFractionDigits(5);
//setMaximumFractionDigits(int) 设置数值的小数部分允许的最大位数。
format.setMaximumIntegerDigits( 10 );
//setMaximumIntegerDigits(int)  设置数值的整数部分允许的最大位数。 
format.setMinimumIntegerDigits(0);
//setMinimumIntegerDigits(int)  设置数值的整数部分允许的最小位数