大数据BigDecimal工具类

news2024/11/18 14:48:20

我们在开发中经常要对数据进行运算,获取对应正确的数值,而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不严格的话也可以,根据需求而定 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Selenium自动化测试细节讲解

与以前瀑布式开发模式不同&#xff0c;现在软件测试人员具有使用自动化工具执行测试用例套件的优势&#xff0c;而以前&#xff0c;测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试&#xff0c;而是最大程度地减少手动运行的测试。自动化…

Versal 自适应 SoC SelectMAP 启动检查表

Versal 自适应 SoC SelectMAP 启动检查表 本文档提供了有关 SelectMAP 启动设置的技巧和指南。在提交个案服务请求之前&#xff0c;应认真查看以下检查表。SelectMAP 启动模式的常规检查表&#xff1a; 是否已查看 SelectMAP 文档&#xff0c;了解连接和电源轨的用法&#…

Spring事务一网打尽

Spring事务一网打尽 什么是事务首先说一个坑Spring 中的事务两种用法三大基础设施编程性事务TransactionManager 实现编程性事务TransactionTemplate 实现编程性事务 声明式事务XML配置声明式事务注解配置声明式事务注解XML混合配置声明式事务 什么是事务 这里要额外补充一点&a…

单片机第三季-第五课:GPIO控制LED

目录 1&#xff0c;GPIO数据手册 1.1&#xff0c;端口配置寄存器 ​1.2&#xff0c;端口输入数据寄存器和端口输出数据寄存器 ​1.3&#xff0c;端口位设置/清除寄存器 1.4&#xff0c;端口位清除寄存器 2&#xff0c;原理图分析和MDK工程 3&#xff0c;写代码通过GP…

快速入门:教你如何使用vue-element-admin 集成框架开发项目(保姆式教学)

设置完中文界面&#xff0c;打开是这样的 端口号更改 嘿嘿&#xff0c;要把项目改成自己的&#xff0c;是不是要更改标题啊 题目更改 src/utils/get-page-title.js src/settings.js 如何添加菜单页面 添加菜单页面&#xff08;父菜单/子菜单&#xff09; 效果图 添加自己的页…

Unity--视觉组件(Raw Image,Mask)||Unity--视觉组件(Text,Image)

1.Raw Image 2.mask “”Raw Image&#xff1a;“” Texture&#xff1a;&#xff08;纹理&#xff09; 表示要显示的图像的纹理&#xff1b; Color&#xff1a;&#xff08;颜色&#xff09; 应用于图像的颜色&#xff1b; Material&#xff1a;&#xff08;材质&#xff09…

FreeRTOS源码阅读笔记3--queue.c

消息队列可以应用于发送不定长消息的场合&#xff0c;包括任务与任务间的消息交换&#xff0c;队列是 FreeRTOS 主要的任务间通讯方式&#xff0c;可以在任务与任务间、中断和任务间传送信息&#xff0c;发送到 队列的消息是通过拷贝方式实现的&#xff0c;这意味着队列存储…

前端开发项目中使用字体库

开发中有些项目要求使用固定的字体&#xff0c;这就需要项目中使用字体库。 首先需要下载字体库 将下载的字体文件放进项目中 在项目代码样式文件中定义字体 font-face {font-family: "Tobias-SemiBold";src: url("./assets/font/Tobias-SemiBold.ttf"…

arcgis基础篇--实验

一、绘制带空洞的面要素 方法一&#xff1a;先绘制出一个面区域&#xff0c;然后在面上再绘制一个面区域代表面洞&#xff0c;两者位于同一个图层内&#xff0c;选中代表面洞的区域&#xff0c;选择【编辑器】-【裁剪】工具&#xff0c;将面裁剪出一个洞&#xff0c;随后删除代…

jupyter notebook添加markdown目录

jupyternotebook添加markdown目录 1. 安装python包2. 安装JavaScript和CSS文件3. 启用扩展4. 设置markdown选项 1. 安装python包 官方安装 使用pip pip install jupyter_contrib_nbextensions # 或者 pip install https://github.com/ipython-contrib/jupyter_contrib_nbext…

苹果M3处理器跑分曝光,单核无敌!

10月底&#xff0c;苹果发布了全新的M3、M3 Pro、M3 Max芯片以及搭载M3系列芯片的3款新硬件&#xff0c;包括&#xff1a;新款24英寸iMac、新款14/16英寸MacBook Pro。 根据苹果官方介绍&#xff0c;M3系列芯片基于台积电3纳米工艺打造&#xff0c;采用全新图形处理器架构&…

【操作系统内核】线程

【操作系统内核】线程 为什么需要线程 比如我要做一个视频播放器&#xff0c;就需要实现三个功能&#xff1a; ① 从磁盘读取视频数据 ② 对读取到的视频数据进行解码 ③ 对解码的数据进行播放 如果串行执行&#xff08;通过一个进程来执行&#xff09;&#xff1a; 那么…

视通科技新品发布:4K30分布式编解码一体机,高性价比之选!

随着信息技术的日新月异&#xff0c;各领域对于音视频传输、控制和显示等方面的需求呈现出爆发式的增长。这种需求的增长源于多种因素&#xff0c;包括但不限于高清视频的普及&#xff0c;实时音视频通信的广泛应用&#xff0c;以及各种显示设备的升级换代。 在这样的背景下&a…

动态规划(5)---Leetcode338.比特位计数

题目 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 分析 通常动态规划的做题顺序&#xff0c;先确定dp数组dp[i],然后确定确定递推公式&#xff0c;再dp数…

Gogs安装和部署教程-centos上

0、什么是 Gogs? Gogs 是一款极易搭建的自助 Git 服务。 Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发&#xff0c;并且支持 Go 语言支持的 所有平台&#xff0c;包括 Linux、Mac OS X、Windo…

华为防火墙2种局域网内远程监控其它端口的方法

防火墙必须要工作在三层&#xff0c;接口上有地址 第一种用ip-link 这种方法是如果监测的接口故障后&#xff0c;自身优先级降低2 FW3 ip-link check enable ip-link 1 destination 1.1.1.1 interface g0/0/0 mode icmp hrp track ip-link 1 active FW4 ip-link check …

Hls学习(一)

1&#xff1a;CPU、DSP、GPU都算软件可编程的硬件 2&#xff1a;dsp在递归方面有所减弱&#xff0c;在递归方面有所增强&#xff0c;比如递归啊等&#xff0c;GPU可以同时处理多个进程&#xff0c;对于大块数据&#xff0c;流处理比较适用 3&#xff1a;为了提高运算量处理更多…

7-Zip的介绍和【阿里云盘】的使用

7zip从入门到入坑 前言一、7-zip的介绍和安装1、基本介绍1&#xff09;7-Zip 主要特征2&#xff09;支持格式3&#xff09;基础功能4&#xff09;安装环境需求 2、基本操作&#xff08;1&#xff09;简便的界面&#xff08;2&#xff09;发生的问题 二、阿里云盘的使用1、“exe…

OSG练习:模仿Ventsim制作三维矿井智能通风系统

1、效果 2、计划内容 1) 三维场景的加载显示;已实现 2)矿井巷道建模及纹理;已实现 3)矿井基础数据采集及修正;已实现 4)通风网络解算算法;已实现 5)通风设备及设施模型制作;未实现 6)风流模拟效果 ;进行中 7)火灾模拟效果;未实现 8)巷道属性查看栏;未实现 9)…

k8s 裸金属集群部署metalLB软负载均衡 —— 筑梦之路

metalLB 官方网站 Repo&#xff1a;https://github.com/metallb/metallb 官网&#xff1a;https://metallb.universe.tf/installation metalLB解决什么问题&#xff1f; MetalLB 是一个用于裸机 Kubernetes 集群的负载均衡器实现&#xff0c;使用标准路由协议。 k8s 并没有为裸…