• BigDecimal正确使用姿势


    BigDecimal

    https://blog.csdn.net/qq_35539512/article/details/79484044?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link

    1.0BigDecimal减法

         public static BigDecimal safeSubtract(BigDecimal num1, BigDecimal num2) {
            if (num1 == null) {
                num1 = BigDecimal.ZERO;
            }
            if (num2 == null) {
                num2 = BigDecimal.ZERO;
            }
            return num1.subtract(num2);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.1 BigDecimal除法

    踩坑:divide整出除不尽问题

    BigDecimal b1 = new BigDecimal(1);
    BigDecimal b2 = new BigDecimal(3);
    BigDecimal divide1 = b1.divide(b2, 3, RoundingMode.DOWN);
    System.out.println(divide1);
    
    • 1
    • 2
    • 3
    • 4

    1.2 BigDecimal累加

    add踩坑

    DO中属性priority进行累加
    BigDecimal priorityTotal = doList.stream().map(DO::getPriority).reduce(BigDecimal.ZERO, BigDecimal::add);
    
    • 1
    • 2
    对集合中DTO类中saleCount属性值进行累加,获取GMV
    BigDecimal gmv = BigDecimal.ZERO;
    for (DTO dto : dtoList) {
        gmv = gmv.add(sellOutWarnSkuDTO.getSaleCount());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.3 BigDecimal转为double,并累加

    dtoList.stream().mapToDouble(
                    dto -> DTO.getSalePcs().doubleValue()).sum();
    
    • 1
    • 2

    Bigdecimal转Double并四舍五入保留两位小数

    public static Double bigDecimal2double2Reserve(BigDecimal bigDecimal) {
            return bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
        }
    
    • 1
    • 2
    • 3

    1.4 BigDecimalFormat使用

    public static void main(String[]args){
        double pi = 3.1415927; //圆周率
        //取一位整数
        System.out.println(new DecimalFormat("0").format(pi));   //3
        //取一位整数和两位小数
        System.out.println(new DecimalFormat("0.00").format(pi)); //3.14
        //取两位整数和三位小数,整数不足部分以0填补。
        System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
        //取所有整数部分
        System.out.println(new DecimalFormat("#").format(pi));   //3
        //以百分比方式计数,并取两位小数
        System.out.println(new DecimalFormat("#.##%").format(pi)); //314.16%
         long c =299792458;  //光速
        //显示为科学计数法,并取五位小数
        System.out.println(new DecimalFormat("#.#####E0").format(c)); //2.99792E8
        //显示为两位整数的科学计数法,并取四位小数
        System.out.println(new DecimalFormat("00.####E0").format(c)); //29.9792E7
        //每三位以逗号进行分隔。
        System.out.println(new DecimalFormat(",###").format(c));   //299,792,458
        //将格式嵌入文本
        System.out.println(new DecimalFormat("光速大小为每秒,###米。").format(c));
      
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    1.5 BigDecimal转为String

    BigDecimal gmv = xxxxx;
    DecimalFormat format = new DecimalFormat("这里的pattern格式可以参考1.4中的BigDecimalFormat使用");
    String s = format.format(gmv);
    
    • 1
    • 2
    • 3

    BigDecimal转为String展示

    • 最好不要用doble展示,因为可能出现科学计算法的展示形式1.6E
    • 补充:可以参考1.4 BigDecimalFormat使用

    不要科学计算法,且不要无用的小数位

            BigDecimal pcs = BigDecimal.valueOf(5454545453.1415926);
            String plainString = pcs.stripTrailingZeros().toPlainString();
    
    • 1
    • 2
            BigDecimal decimal = new BigDecimal(123456789.2345);
            double doubleValue = decimal.doubleValue();
            String res = decimal.stripTrailingZeros().toPlainString();
            System.out.println(decimal);
            System.out.println(doubleValue);
            System.out.println(res);
    123456789.23450000584125518798828125
    1.234567892345E8
    123456789.23450000584125518798828125
      
            //保留两位小数
            BigDecimal newBigDecimal = decimal.setScale(2, BigDecimal.ROUND_HALF_UP);
            double newDoubleValue = newBigDecimal.doubleValue();
            String newRes = newBigDecimal.stripTrailingZeros().toPlainString();
            System.out.println(newBigDecimal);
            System.out.println(newDoubleValue);
            System.out.println(newRes);
    123456789.23
    1.2345678923E8
    123456789.23
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.6 小数点处理setScale:https://blog.csdn.net/ahwr24/article/details/7048724

    1.7 比较大小

    【强制】 BigDecimal需要使用compareTo()

    因为BigDecimal的equals()还会比对精度,2.0与2.00不一致。

  • 相关阅读:
    rancher 导入k8s集群
    ArcGIS影像TIF拼接
    pytest之parametrize()实现数据驱动
    ESP8266--Arduino开发(驱动WS2812B)
    Docker安装
    Spring Boot注册Web组件
    【Spirng】@Component和@Configuration和@Bean的区别
    宠物疾病 与 光线疗法
    第1章、温故而知新
    超级玛丽-c++
  • 原文地址:https://blog.csdn.net/tmax52HZ/article/details/133102539