BigDecimal保留两位小数

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测监控 Prometheus 版,每月50GB免费额度
云原生网关 MSE Higress,422元/月
简介: 本文介绍了BigDecimal保留两位小数的三种方法:`setScale`、`DecimalFormat`和`String.format`。其中,`setScale`可设置保留规则并返回BigDecimal类型值;`DecimalFormat`通过匹配规则返回字符串类型值;`String.format`为字符串自带方法,同样返回字符串类型值。此外,文章还对比了四种保留小数规则(如`00.00`、`#0.00`等),总结出`#0.00`是最适用的规则。附有详细代码示例与控制台打印结果,便于理解与实践。

1. BigDecimal保留两位小数的方法

三种方式保留两位小数的方法

1.1 setScale

此方法可以设置保留位数和保留的规则
得到的同样是一个BigDecimal类型的值

        Double d = 123.12345;
        BigDecimal bd = new BigDecimal(d);
        //调用函数 参数2表示保留两位小数,ROUND_HALF_UP表示四舍五入
        //bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
        BigDecimal bd1 = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("bd1: "+bd1);

1.2 DecimalFormat

此方法使用匹配规则
得到的是一个字符串类型的值

        Double d = 123.12345;
        BigDecimal bd = new BigDecimal(d);
        DecimalFormat df = new DecimalFormat("#0.00");
        String str1 = df.format(bd);
        //输出结果为123.12
        System.out.println(str1);

1.3 String.Format

此方法是字符串自带的方法
得到的是一个字符串类型的值

        Double d = 123.12345;
        BigDecimal bd = new BigDecimal(d);
        String str2 = String.format("%.2f",bd);
        System.out.println("str2: "+str2);

以上直接食用
分割线-----------------------------------------------------------------------------------------------------------------
以下是拓展

2. 四种保留小数规则对比

直接上代码

package com.data.controller;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * @Description:  BigDecimal保留两位小数测试
 * @Version 1.0
 * @Author 李白
 * @Date 2023/7/14 星期五 9:47
 */
public class BigDecimalTest {
   

    public static void main(String[] args) {
   

        //setScale
//        Double d = 123.12345;
//        BigDecimal bd = new BigDecimal(d);
//        //调用函数 参数2表示保留两位小数,ROUND_HALF_UP表示四舍五入
//        //bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
//        BigDecimal bd1 = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
//        System.out.println("bd1: "+bd1);

        //DecimalFormat
//        Double d = 123.12345;
//        BigDecimal bd = new BigDecimal(d);
//        DecimalFormat df = new DecimalFormat("#0.00");
//        //输出结果为123.12
//        System.out.println(df.format(bd));

        //String.Format
//        Double d = 123.12345;
//        BigDecimal bd = new BigDecimal(d);
//        String str2 = String.format("%.2f",bd);
//        System.out.println("str2: "+str2);

        //整数位为0
        BigDecimal bdt1 = new BigDecimal(0.0);
        BigDecimal bdt2 = new BigDecimal(0.1);
        BigDecimal bdt3 = new BigDecimal(0.10);
        BigDecimal bdt4 = new BigDecimal(0.01);
        BigDecimal bdt5 = new BigDecimal(0.001);
        BigDecimal bdt6 = new BigDecimal(0.100);
        //整数位为一位整数
        BigDecimal bdt7 = new BigDecimal(1.0);
        BigDecimal bdt8 = new BigDecimal(1.1);
        BigDecimal bdt9 = new BigDecimal(1.00);
        BigDecimal bdt10 = new BigDecimal(1.10);
        BigDecimal bdt11 = new BigDecimal(1.01);
        BigDecimal bdt12 = new BigDecimal(1.001);
        BigDecimal bdt13 = new BigDecimal(1.100);
        //整数位为两位整数
        BigDecimal bdt14 = new BigDecimal(10.001);
        //整数位为三位整数
        BigDecimal bdt15 = new BigDecimal(101.001);

        //规则一 在整数位和小数位都满足两位或者以上的时候不受影响,当整数位或小数位少于两位时会自动填充为0
        String dp1 = "00.00";
        //规则二 是满足所有条件的保留两位小数规则,当小数位不满两位会自动填充为0,当整数位不满两位不会填充
        String dp2 = "#0.00";
        //规则三 在整数位不满两位时不会自动填充,当小数位不满两位时也不会填充,且在小数位前两位都为0的情况下会将小数点和小数位都剔除,当小数位前一位不为0后一位为0则只会保留一位不为0的小数
        String dp3 = "##.00";
        //规则四 整数位为一位且为0则缺失,小数位保留两位,不足两位会自动填充
        String dp4 = "##.##";

        DecimalFormat df1 = new DecimalFormat(dp1);
        DecimalFormat df2 = new DecimalFormat(dp2);
        DecimalFormat df3 = new DecimalFormat(dp3);
        DecimalFormat df4 = new DecimalFormat(dp4);

        //保留两位小数
        System.out.println("-------------------00.00--------------------");
        System.out.println(df1.format(bdt1));
        System.out.println(df1.format(bdt2));
        System.out.println(df1.format(bdt3));
        System.out.println(df1.format(bdt4));
        System.out.println(df1.format(bdt5));
        System.out.println(df1.format(bdt6));
        System.out.println(df1.format(bdt7));
        System.out.println(df1.format(bdt8));
        System.out.println(df1.format(bdt9));
        System.out.println(df1.format(bdt10));
        System.out.println(df1.format(bdt11));
        System.out.println(df1.format(bdt12));
        System.out.println(df1.format(bdt13));
        System.out.println(df1.format(bdt14));
        System.out.println(df1.format(bdt15));

        System.out.println("-------------------#0.00--------------------");
        System.out.println(df2.format(bdt1));
        System.out.println(df2.format(bdt2));
        System.out.println(df2.format(bdt3));
        System.out.println(df2.format(bdt4));
        System.out.println(df2.format(bdt5));
        System.out.println(df2.format(bdt6));
        System.out.println(df2.format(bdt7));
        System.out.println(df2.format(bdt8));
        System.out.println(df2.format(bdt9));
        System.out.println(df2.format(bdt10));
        System.out.println(df2.format(bdt11));
        System.out.println(df2.format(bdt12));
        System.out.println(df2.format(bdt13));
        System.out.println(df2.format(bdt14));
        System.out.println(df2.format(bdt15));
        System.out.println("-------------------##.00--------------------");
        System.out.println(df3.format(bdt1));
        System.out.println(df3.format(bdt2));
        System.out.println(df3.format(bdt3));
        System.out.println(df3.format(bdt4));
        System.out.println(df3.format(bdt5));
        System.out.println(df3.format(bdt6));
        System.out.println(df3.format(bdt7));
        System.out.println(df3.format(bdt8));
        System.out.println(df3.format(bdt9));
        System.out.println(df3.format(bdt10));
        System.out.println(df3.format(bdt11));
        System.out.println(df3.format(bdt12));
        System.out.println(df3.format(bdt13));
        System.out.println(df3.format(bdt14));
        System.out.println(df3.format(bdt15));
        System.out.println("-------------------##.##--------------------");
        System.out.println(df4.format(bdt1));
        System.out.println(df4.format(bdt2));
        System.out.println(df4.format(bdt3));
        System.out.println(df4.format(bdt4));
        System.out.println(df4.format(bdt5));
        System.out.println(df4.format(bdt6));
        System.out.println(df4.format(bdt7));
        System.out.println(df4.format(bdt8));
        System.out.println(df4.format(bdt9));
        System.out.println(df4.format(bdt10));
        System.out.println(df4.format(bdt11));
        System.out.println(df4.format(bdt12));
        System.out.println(df4.format(bdt13));
        System.out.println(df4.format(bdt14));
        System.out.println(df4.format(bdt15));

        System.out.println("---------------------------------------");
    }
}

3. 控制台打印

IDEA中执行上面代码后控制台打印结果

-------------------00.00--------------------
00.00
00.10
00.10
00.01
00.00
00.10
01.00
01.10
01.00
01.10
01.01
01.00
01.10
10.00
101.00
-------------------#0.00--------------------
0.00
0.10
0.10
0.01
0.00
0.10
1.00
1.10
1.00
1.10
1.01
1.00
1.10
10.00
101.00
-------------------##.00--------------------
.00
.10
.10
.01
.00
.10
1.00
1.10
1.00
1.10
1.01
1.00
1.10
10.00
101.00
-------------------##.##--------------------
0
0.1
0.1
0.01
0
0.1
1
1.1
1
1.1
1.01
1
1.1
10
101
---------------------------------------

Process finished with exit code 0

4. 总结

对比打印结果可知

  • 第一种00.00在整数位和小数位都满足两位或者以上的时候不受影响,当整数位或小数位少于两位时会自动填充为0
  • 第二种#0.00是满足所有条件的保留两位小数规则,当小数位不满两位会自动填充为0,当整数位不满两位不会填充
  • 第三种##.00整数位为一位且为0则缺失,小数位保留两位,不足两位会自动填充
  • 第四种##.##在整数位不满两位时不会自动填充,当小数位不满两位时也不会填充,且在小数位前两位都为0的情况下会将小数点和小数位都剔除,当小数位前一位不为0后一位为0则只会保留一位不为0的小数

    综上,保留两位小数时最好用的是#0.00


CSDN链接:https://hanshan.blog.csdn.net/article/details/131718568

目录
相关文章
|
存储 Java
BigDecimal类型的数据如何保留小数点后四位
BigDecimal类型的数据如何保留小数点后四位
420 0
|
11月前
|
Java
bigdecimal加减乘除
bigdecimal加减乘除
|
11月前
|
存储
高精度(小数——BigDecimal)
高精度(小数——BigDecimal)
BigDecimal如何相除并保留小数后两位(多种方法比较可选)
BigDecimal如何相除并保留小数后两位(多种方法比较可选)
523 0
|
Java
BigDecimal详解和精度问题
BigDecimal详解和精度问题
227 0
|
Java
BigDecimal 比较大小(加减等)
BigDecimal 比较大小(加减等)
313 0
C# 保留两位小数
C# 保留两位小数
151 0
BigDecimal加减乘除以及大小比较
BigDecimal加减乘除以及大小比较
132 0
BigDecimal 保留2位小数
BigDecimal 保留2位小数
284 0
|
Java
小数的运算使用BigDecimal
小数的运算使用BigDecimal
141 0
小数的运算使用BigDecimal