BigDecimal保留两位小数

1.1、结论:

  1. 如果最终结果要的是数值,则优先使用 BigDecimal自有API 。如:decimal.setScale(2,BigDecimal.ROUND_HALF_UP) ,其中第二个参数为‘进位模式’,根据实际情况选择进位模式即可。
  2. 如果最终结果需要格式化为非数值的字符串,可以考虑采用 DecimalFormat 。【特别注意】DecimalFormat不同的格式模版,在不同场景中显示的特殊性,尤其是,"#.#"对于整数位为零时显示的特殊性(如,“0.12”会显示为".1")。

1.2、BigDecimal自有API 方法 : decimal.setScale(2,BigDecimal.ROUND_HALF_UP)

1.2.1、setScale() 方法,参数解释及作用

decimal.setScale(2,BigDecimal.ROUND_HALF_UP)

参数1:代表小数点后保留的位数。此为保留两位小数。
参数2:小数点后的数值,如果需要进位时,进位舍入的方式。BigDecimal.ROUND_HALF_UP 为四舍五入进位方式。

        以上代码块中的代码,表示“保留两位小数,按照四舍五入方式进位”。其中程序在处理时,按照以下逻辑处理:

  • 整数部分如果没有值,会自动赋值为零。
  • 小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则按照四舍五入进位处理。

1.2.2、代码自测实践

---- setScale(2,BigDecimal.ROUND_HALF_UP) 程序在处理时,按照以下逻辑处理:
---- 整数部分如果没有值,会自动赋值为零。
---- 小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则按照四舍五入进位处理。
public static void main(String[] args) {
    BigDecimal decimal = new BigDecimal("0");
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 0.00

    decimal = new BigDecimal(1.1/100);  // 0.011
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 0.01

    decimal = new BigDecimal(50.1/100); // 0.501
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 0.50

    decimal = new BigDecimal(-1.1/100); // -0.011
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// -0.01

    decimal = new BigDecimal(-50.1/100); // -0.501
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// -0.50

    decimal = new BigDecimal("2");
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.00

    decimal = new BigDecimal("2.2");
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.20

    decimal = new BigDecimal("2.456");
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.46


    decimal = new BigDecimal("2.451");
    System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.45
}

----- 日志打印结果:
0.00
0.01
0.50
-0.01
-0.50
2.00
2.20
2.46
2.45

1.3、使用 DecimalFormat 进行格式化 : 结果可以是数值,也可以格式化为非数值的字符串(如:A2.45B)

1.3.1、DecimalFormat 使用样例

//设置格式化的模版,如:"0000.0000"、"0.##"等
DecimalFormat df1 = new DecimalFormat("0000.0000");

BigDecimal decimal = new BigDecimal("123.123");

//格式化decimal的值
df1.format(decimal)   //  格式化后,值为 0123.1230

【特别注意】使用 DecimalFormat 进行格式化 : 结果可以是数值,也可以格式化为非数值的字符串(如:A2.45B)。

1.3.2、格式化模版,特殊字符说明

特殊字符说明:

  • “0” 指定位置不存在数字,则显示为0 ,如:格式模版为 '0000.0000',则 123.123 结果为 0123.1230
  • “#” 指定位置不存在数字,则不显示, 如:格式模版为'####.####' , 则 123.123 结果为 123.123
  • “.” 表示小数点
  • “%” 会将结果数字乘以100,后面再加上% 进行显示。如:格式模版为'#.00%' , 则 123.123 结果为 12312.30%

代码自测实践
public static void main(String[] args) {
    DecimalFormat df1 = new DecimalFormat("0000.0000");
    DecimalFormat df2 = new DecimalFormat("####.####");
    DecimalFormat df3 = new DecimalFormat("#.00%");

    BigDecimal decimal = new BigDecimal("123.123");
    System.out.println(df1.format(decimal));    //  0123.1230
    System.out.println(df2.format(decimal));    //  123.123
    System.out.println(df3.format(decimal));    //  12312.30%
}

---- 日志打印结果:
0123.1230
123.123
12312.30%

1.3.3、使用 DecimalFormat,将结果保留两位小数

模版一:
DecimalFormat df1 = new DecimalFormat("0.00");

结果:
整数位为零时,不会出现舍去整数位的情况,会显示为零。
小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则进位处理。
模版二:
DecimalFormat df1 =new DecimalFormat("#.00");

结果:
整数位为零时,会舍去整数位,如结果为“.00”、“.12” 。整数位不为零时,正常显示。
小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则进位处理。 

1.3.4、使用 DecimalFormat,将结果保留两位小数,并且在前后加上字符

格式模版:"A.00B"
DecimalFormat df1 = new DecimalFormat("A.00B");

结果:
0.00时,结果为:A.00B
0.12时,结果为:A.12B
2.00时,结果为:A2.00B
2.46时,结果为:A2.46B

1.3.5、代码自测实践

1、格式化模版: "0.00"、"8.00"、"88.00"、"A.00"、"A.00B"
public static void main(String[] args) {
    // 整数位为零时,不会出现舍去整数位的情况,整数位会赋值为零。
    // 小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则进位处理。
    DecimalFormat df1 = new DecimalFormat("0.00");

    BigDecimal decimal = new BigDecimal("0");
    System.out.println(df1.format(decimal));    //  0.00

    decimal = new BigDecimal("0.123");
    System.out.println(df1.format(decimal));    //  0.12

    decimal = new BigDecimal("-0.123");
    System.out.println(df1.format(decimal));    //  -0.12

    decimal = new BigDecimal("2");
    System.out.println(df1.format(decimal));    //  2.00

    decimal = new BigDecimal("2.2");
    System.out.println(df1.format(decimal));    //  2.20

    decimal = new BigDecimal("2.456");
    System.out.println(df1.format(decimal));    //  2.46

    decimal = new BigDecimal("2.451");
    System.out.println(df1.format(decimal));    //  2.45

    decimal = new BigDecimal("-2.456");
    System.out.println(df1.format(decimal));    //  -2.46

    decimal = new BigDecimal("-2.451");
    System.out.println(df1.format(decimal));    //  -2.45
}

------ 日志打印结果:
0.00
0.12
-0.12
2.00
2.20
2.46
2.45
-2.46
-2.45


-------------------------- 改动一:修改格式为 "8.00"
DecimalFormat df1 = new DecimalFormat("8.00");
日志打印结果:相当于先通过"#.00"计算结果,然后再在计算结果的前面加一个8
8.00
8.12
-8.12
82.00
82.20
82.46
82.45
-82.46
-82.45

-------------------------- 改动二:修改格式为 "88.00"
DecimalFormat df1 = new DecimalFormat("88.00");
日志打印结果:
88.00
88.12
-88.12
882.00
882.20
882.46
882.45
-882.46
-882.45

-------------------------- 改动三:修改格式为 "A.00"
DecimalFormat df1 = new DecimalFormat("A.00");
日志打印结果:
A.00
A.12
-A.12
A2.00
A2.20
A2.46
A2.45
-A2.46
-A2.45

-------------------------- 改动四:修改格式为 "A.00B"
DecimalFormat df1 = new DecimalFormat("A.00B");
日志打印结果:
A.00B
A.12B
-A.12B
A2.00B
A2.20B
A2.46B
A2.45B
-A2.46B
-A2.45B

2、格式化模版:"#.00"、"#.0#"、"#.#0"
public static void main(String[] args) {
    //整数位为零时,会舍去整数位,如:“.00”、“.12”
    DecimalFormat df1 = new DecimalFormat("#.00");

    BigDecimal decimal = new BigDecimal("0");
    System.out.println(df1.format(decimal));    //  .00

    decimal = new BigDecimal("0.123");
    System.out.println(df1.format(decimal));    //  .12

    decimal = new BigDecimal("-0.123");
    System.out.println(df1.format(decimal));    //  -.12

    decimal = new BigDecimal("2");
    System.out.println(df1.format(decimal));    //  2.00

    decimal = new BigDecimal("2.2");
    System.out.println(df1.format(decimal));    //  2.20

    decimal = new BigDecimal("2.456");
    System.out.println(df1.format(decimal));    //  2.46

    decimal = new BigDecimal("2.451");
    System.out.println(df1.format(decimal));    //  2.45

    decimal = new BigDecimal("-2.456");
    System.out.println(df1.format(decimal));    //  -2.46

    decimal = new BigDecimal("-2.451");
    System.out.println(df1.format(decimal));    //  -2.45
}


----- 日志打印结果:
.00
.12
-.12
2.00
2.20
2.46
2.45
-2.46
-2.45

--------------------------------------- 改动一 : 修改格式为 "#.0#"
DecimalFormat df1 = new DecimalFormat("#.0#");
日志打印结果如下:小数点后的第二位,有值时显示对应值,没有值时不显示。
.0
.12
-.12
2.0
2.2
2.46
2.45
-2.46
-2.45

--------------------------------------- 改动二 : 修改格式为 "#.#0"
DecimalFormat df1 = new DecimalFormat("#.#0");
运行程序时,抛出异常:
Exception in thread "main" java.lang.IllegalArgumentException: Malformed pattern "#.#0"
        at java.text.DecimalFormat.applyPattern(DecimalFormat.java:3444)
        at java.text.DecimalFormat.<init>(DecimalFormat.java:436)

3、格式化模版:"#.##"
public static void main(String[] args) {
    //整数位为零时,不会出现舍去整数位的情况,整数位会赋值为零。
    //小数位,根据实际的小数位数,保留一位或两位。超过两位时,按照进位处理。
    DecimalFormat df1 = new DecimalFormat("#.##");

    BigDecimal decimal = new BigDecimal("0");
    System.out.println(df1.format(decimal));    //  0

    decimal = new BigDecimal("0.123");
    System.out.println(df1.format(decimal));    //  0.12

    decimal = new BigDecimal("-0.123");
    System.out.println(df1.format(decimal));    //  -0.12

    decimal = new BigDecimal("2");
    System.out.println(df1.format(decimal));    //  2

    decimal = new BigDecimal("2.2");
    System.out.println(df1.format(decimal));    //  2.2

    decimal = new BigDecimal("2.456");
    System.out.println(df1.format(decimal));    //  2.46

    decimal = new BigDecimal("2.451");
    System.out.println(df1.format(decimal));    //  2.45

    decimal = new BigDecimal("-2.456");
    System.out.println(df1.format(decimal));    //  -2.46

    decimal = new BigDecimal("-2.451");
    System.out.println(df1.format(decimal));    //  -2.45
}

------ 日志打印结果:
0
0.12
-0.12
2
2.2
2.46
2.45
-2.46
-2.45
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值