码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • BigDecimal正确使用姿势


    文章目录

    • BigDecimal
        • 1.0BigDecimal减法
        • 1.1 BigDecimal除法
        • 1.2 BigDecimal累加
        • 1.3 BigDecimal转为double,并累加
        • Bigdecimal转Double并四舍五入保留两位小数
        • 1.4 BigDecimalFormat使用
        • 1.5 BigDecimal转为String
        • BigDecimal转为String展示
        • 1.6 小数点处理setScale:https://blog.csdn.net/ahwr24/article/details/7048724
        • 1.7 比较大小

    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不一致。

  • 相关阅读:
    程序员保密协议-中文
    spring-boot-maven-plugin插件 —— 重新打包分类
    【JavaScript脚本宇宙】打造完美用户体验:六大模态库全解析
    【Docker】redis分片集群搭建:3主3从,容错迁移,扩缩容
    关于#amesim#的问题,如何解决?
    golang的垃圾回收算法之八清除和回收
    Android Jetpack Navigation基本使用
    windows10系统-15-markdown编辑器和文本复制工具Textify
    Linux常用环境Docker安装
    串口服务器通信时间试验
  • 原文地址:https://blog.csdn.net/tmax52HZ/article/details/133102539
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号