大数据BigDecimal工具类

我们在开发中经常要对数据进行运算,获取对应正确的数值,而double和float这两个本质都是小数点,没办法使用二进制精确的表示,所以他们是不准确的,这个时候就应该使用大数据BigDecimal进行运算了,它可以精确的算出想要的结果

不需要加依赖和配置,直接copy如下

工具类如下

/**
 * 提供基本的算术运算工具类
 * 包含了加、减、乘、除运算的普通实现和精确实现
 */
public class BigDecimalUtils {
 
    // 默认精确度
    private static final int DEF_DIV_SCALE = 10;
 
    /**
     * 普通加法运算
     *
     * @param v1 加数1
     * @param v2 加数2
     * @return 两个参数的和
     */
    public static BigDecimal add(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2);
    }
 
    /**
     * 精确加法运算
     *
     * @param v1 加数1
     * @param v2 加数2
     * @param scale 结果保留小数位数
     * @return 两个参数的和
     */
    public static BigDecimal add(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("精度必须是非负整数");
        }
        return add(v1, v2).setScale(scale, RoundingMode.HALF_UP);
    }
 
    /**
     * 普通减法运算
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static BigDecimal sub(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2);
    }
 
    /**
     * 精确减法运算
     *
     * @param v1 被减数
     * @param v2 减数
     * @param scale 结果保留小数位数
     * @return 两个参数的差
     */
    public static BigDecimal sub(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("精度必须是非负整数");
        }
        return sub(v1, v2).setScale(scale, RoundingMode.HALF_UP);
    }
 
    /**
     * 普通乘法运算
     *
     * @param v1 乘数1
     * @param v2 乘数2
     * @return BigDecimal 两个参数的乘积
     */
    public static BigDecimal mul(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2);
    }
 
    /**
     * 精确乘法运算
     *
     * @param v1 乘数1
     * @param v2 乘数2
     * @param scale 小数点后保留的位数
     * @return BigDecimal 设置了精度的乘积结果
     * @throws IllegalArgumentException 如果指定的精度scale为负数。
     */
    public static BigDecimal mul(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("精度必须是非负整数");
        }
        return mul(v1, v2).setScale(scale, RoundingMode.HALF_UP);
    }
 
    /**
     * 普通除法运算
     *
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static BigDecimal div(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.divide(b2, DEF_DIV_SCALE, RoundingMode.HALF_UP);
    }
 
    /**
     * 精确除法运算
     *
     * @param v1 被除数
     * @param v2 除数
     * @param scale 结果的精度,必须是非负整数
     * @return 返回除法的结果,结果的精度为指定的scale
     * @throws IllegalArgumentException 如果指定的精度是负数
     */
    public static BigDecimal div(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("精度必须是非负整数");
        }
        return div(v1, v2).setScale(scale, RoundingMode.HALF_UP);
    }
 
    /**
     * 比较两个数的大小
     *
     * @param v1 第一个数
     * @param v2 第二个数
     * @return 返回0表示相等,返回正数表示v1大于v2,返回负数表示v1小于v2
     */
    public static int compare(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.compareTo(b2);
    }
 
    /**
     * 设置BigDecimal的精度
     *
     * @param v 需要设置精度的数
     * @param scale 新的精度值
     * @return 返回设置了新精度的BigDecimal
     * @throws IllegalArgumentException 如果指定的精度是负数
     */
    public static BigDecimal setScale(String v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("精度必须是非负整数");
        }
        BigDecimal b = new BigDecimal(v);
        return b.setScale(scale, RoundingMode.HALF_UP);
    }
 
}

注意事项

1.创建一个Bigdecimal构造函数需要时字符串,不能是double,应为使用一个不精确的数据创建的Bigdecimal也是不精确的

比如这个加法函数

7f2e4055452644d7b7c663b3ec096fac.png

2. 使用比较的话不能使用equals需要使用compareto这个方法,因为equals这个方法会比较精度

813a6d09b30e450a805d0c7ceda33805.png

结果如下

26f06ff05bd445d48585603b2eacf969.png

在这个例子中,num1和num2的值相同,但由于精度不同,equals方法返回了false;如果运行这段代码,输出将是"两个数字不相等";这说明了Bigdecimal的equals方法考虑了精度

所以需要使用如下

054e00ae0587471d968a186ee71e8709.png

结果如下

72b0530cfcf24840968ecbf4be6fe045.png

 3.输出的结果使用toPlainString,如果使用toString很可能会出现科学计数法的结果,比如

1eb413aa200c4288b2d6fe84ba916f39.png

 结果如下

accbab78150a4cd6b7f880ae16e96586.png

而使用toPlainString

0e3eb7386f544b3ba02b9972e115f65f.png

结果如下

e2ff753c0f7546ac9fdd65089b6560be.png

4.最后,使用Bigdecimal也需要再数据库字段使用这个类型,否则会缺少精度,其实使用String,带位数的double不严格的话也可以,根据需求而定 

这样就可以实现开发者数据的计算了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/133439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OSPF综合

实验拓扑 实验需求&#xff1a; 1 R4为ISP&#xff0c;其上只能配置IP地址; R4与其他所有直连设备间均使用公有IP 2 R3-R5/6/7为MGRE环境&#xff0c;R3为中心站点 ; 3 整个OSPF环境IP基于172.16.0.0/16划分; 4 所有设备均可访问R4的环回; 5 减少LSA的更新量&#xff0c;加快收…

归并分治 计算数组的小和 + 图解 + 笔记

归并分治 前置知识&#xff1a;讲解021-归并排序 归并排序 图解 递归 非递归 笔记-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134338789?spm1001.2014.3001.5501原理&#xff1a; (1&#xff09;思考一个问题在大范围上的答案&#xff0c;是否等于&…

Linux文件系统——重定向

文章目录 1. 文件描述符分配规则2. 重定向接口dup2自定义shell重定向(补充) 3. 标准输出和标准错误4. 如何理解一切接文件 本章代码gitee地址&#xff1a;文件重定向 1. 文件描述符分配规则 文件描述符的分配规则是从0下标开始&#xff0c;寻址最小的没有使用的数组位置&#…

可以体现Python语法精妙的十个例子!

文章目录 前言1.for - else2.一颗星*和两颗星**3.三元表达式4.with - as5.列表推导式6.列表索引的各种骚操作7.lambda函数8.yield 以及生成器和迭代器9.装饰器10.巧用断言assertPython技术资源分享1、Python所有方向的学习路线2、学习软件3、精品书籍4、入门学习视频5、实战案例…

Linux JumpServer 堡垒机远程访问

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

野火i.MX6ULL开发板检测按键evtest(Linux应用开发)

之前一直查找不到evtest&#xff0c;因为没有下载成功&#xff0c;很可能是网络不好&#xff0c;下次可以软件源可以换成国内大学镜像网站。 重新断开板子电源启动&#xff0c;再次连接网络&#xff0c;下载evtest成功&#xff01;&#xff01;

PHP中传值与引用的区别

在PHP中&#xff0c;变量的传递方式主要分为传值和传引用两种。这两种方式在操作中有一些重要的区别&#xff0c;影响着变量在函数调用或赋值操作中的表现。下面详细解释一下这两种传递方式的区别。 传值&#xff08;By Value&#xff09; 传值是指将变量的值复制一份传递给函…

VB.NET—Bug调试(参数话查询、附近语法错误)

目录 前言: BUG是什么&#xff01; 事情的经过: 过程: 错误一: 错误二: 总结: 前言: BUG是什么&#xff01; 在计算机科学中&#xff0c;BUG是指程序中的错误或缺陷&#xff0c;它通过是值代码中的错误、逻辑错误、语法错误、运行时错误等相关问题&#xff0c;这些问题…

CL-MVSNet论文精读

本文是对CL-MVSNet: Unsupervised Multi-View Stereo with Dual-Level Contrastive Learning Kaiqiang Xiong, Rui Peng, Zhe Zhang, Tianxing Feng, Jianbo Jiao, Feng Gao, Ronggang Wang的阅读记录 Proceedings of the IEEE/CVF International Conference on Computer Visio…

miniconda安装

1.下载&#xff1a; Miniconda — miniconda documentation 点击选择对应版本下载&#xff1a; 2.安装 点击next 注意&#xff01;&#xff01;&#xff01; 在选择为谁安装的时候建议选择just me&#xff08;这会让你构建的虚拟环境默认保存在安装路径的envs下&#xff0c…

Nacos入门到运行-超详细~windwos

&#x1f4da;目录 ⚙️简介:⚡️Nacos下载⌛解压到文件⚙️配置信息☘️修改 application.properties ⛵运行程序☘️安全问题☄️程序出现问题查看方式 ⛳Nacos开启鉴权⚡️跳过Token获取数据⚓接口请求&#xff1a; ✍️结束&#xff1a; ⚙️简介: Nacos:正如官网说的,一个…

使用 HTTP Client 轻松进行 API 测试

在开发过程中&#xff0c;我们经常需要测试 API 接口以确保其正常工作。JetBrains 的集成开发环境&#xff08;IDE&#xff09;如 CLion、IntelliJ IDEA、PyCharm 等&#xff0c;默认内置了 HTTP Client 插件&#xff0c;可以方便地进行API测试。本文将介绍如何使用HTTP Client…

人工智能与教育:未来的技术融合

人工智能与教育&#xff1a;未来的技术融合 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;逐渐渗透到我们生活的方方面面&#xff0c;包括教育领域。AI与教育的结合&#xff0c;有望引发一场教育变革&#xff0c;提高教学效果&#xff0c;实现个性化学习&…

Python 列表元素里面含有字典或者列表进行排序

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 示例1&#xff1a;列表里面含有列表进行排序 s [[1, 2], [100, 2], [33, 3], [25, 6]] s.sort(keylambda k: k[0]) print(s)结果&#xff1a; [[1, 2], [25, 6], [33, 3…

SplayTree高分测试用例

测试用例结果展示 覆盖率 变异得分 测试注意点 从SplayTree测起&#xff0c;然后再测SubSplayTree&#xff0c;因为前者调用后者。SplaySubTree的remove方法大部分内容需要通过反射才能测到。value和index在SplayTree当中都不是唯一的。一个index可能对应多个value。 不足之…

[西湖论剑 2022]real_ez_node

文章目录 前置知识EJS模板注入&#xff08;CVE-2022-29078&#xff09;原型链污染漏洞 &#xff08;CVE-2021-25928&#xff09;HTTP响应拆分攻击&#xff08;CRLF&#xff09; 解题过程代码审计构造payload 前置知识 EJS模板注入&#xff08;CVE-2022-29078&#xff09; EJS…

ChatGPT 如何改变科研之路

《Nature》全球博士后调查[1]中约有三分之一的受访者正在使用人工智能聊天机器人来帮助完善文本、生成或编辑代码、整理其领域的文献等等。 来自巴西的 Rafael Bretas 在日本生活了十多年&#xff0c;日语说得很好。书面日语的各个方面&#xff0c;例如严格的礼貌等级制度&…

【蓝桥每日一题]-快速幂,倍增,滑动窗口(保姆级教程 篇1) #麦森数 #青蛙跳

之前是考试准备&#xff0c;所以有几天没更新&#xff0c;今天开始继续更新 目录 快速幂模板 题目&#xff1a;麦森数 思路&#xff1a; 题目&#xff1a;青蛙跳 思路&#xff1a; 快速幂模板 #include <bits/stdc.h> #define ll long long using namespa…

如何知道一个程序为哪些信号注册了哪些信号处理函数?

https://unix.stackexchange.com/questions/379694/is-there-a-way-to-know-if-signals-are-present-in-your-application-and-which-sign 使用 strace

数据结构与算法【二分查找】Java实现

需求&#xff1a;在有序数组 A 内&#xff0c;查找值target 如果找到返回索引如果找不到返回 -1 前提 给定一个内含 n 个元素的有序数组 A&#xff0c;一个待查值 target 1 设置 i0&#xff0c;jn-1 2 如果 i \gt j&#xff0c;结束查找&#xff0c;没找到 3 设置 m (…