Java中熟练掌握BigDecimal运用-工具类

1、BigDecimal介绍

浮点数值不适用于无法接受舍入误差的计算当中,比如金融计算,所以建议用BigDecimal计算金

额问题

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双

精度浮点型变量double可以处理16位有效数。

在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者

是工程计算,在商业计算中要用java.math.BigDecimal。

BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学

运算,而必须调用其相对应的方法。

方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带

有参数的对象。

背景:有些人对BigDecimal接触很少、用得少,对常见的乘法、除法计算有问题,所以封装一下

方便高效运用,减少不必要的bug处理时间。

2、BigDecimal工具类

package com.utils;import org.springframework.util.StringUtils;import java.math.BigDecimal;/*** BigDecimal工具类** 浮点数值不适用于无法接受舍入误差的计算当中,比如金融计算,所以建议用BigDecimal计算金额问题。** 背景:有些人对BigDecimal接触很少、用得少,对常见的乘法、除法计算有问题,所以封装一下方便高效运用,减少不必要的bug处理时间。** Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。** 在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。** BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。** 方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。**/
public class BigDecimalUtil {/*** 默认运算精度*/private static final int DEFAULT_DIV_SCALE = 10;/*** 提供精确的加法运算** @param v1* @param v2* @return 两个参数的和*/public static double add(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2).doubleValue();}/*** 提供精确的加法运算** @param v1* @param v2* @param scale 表示需要精确到小数点以后几位。* @return 两个参数数学加和,以字符串格式返回*/public static double add(double v1, double v2, int scale) {return round(add(v1, v2), 2);}/*** 提供精确的加法运算** @param v1* @param v2* @return 两个参数数学加和,以字符串格式返回*/public static String add(String v1, String v2) {if (StringUtils.isEmpty(v1)) v1 = "0";if (StringUtils.isEmpty(v2)) v2 = "0";BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.add(b2).toString();}/*** 提供精确的加法运算** @param v1* @param v2* @param scale 表示需要精确到小数点以后几位。* @return 两个参数数学加和,以字符串格式返回*/public static String add(String v1, String v2, int scale) {if (StringUtils.isEmpty(v1)) v1 = "0";if (StringUtils.isEmpty(v2)) v2 = "0";return round(add(v1, v2), scale);}/*** 提供精确的减法运算** @param v1* @param v2* @return 两个参数的差*/public static double subtract(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.subtract(b2).doubleValue();}/*** 提供精确的减法运算** @param v1* @param v2* @param scale 表示需要精确到小数点以后几位。* @return 两个参数的差*/public static double subtract(double v1, double v2, int scale) {return round(subtract(v1, v2), scale);}/*** 提供精确的减法运算** @param v1* @param v2* @return 两个参数数学差,以字符串格式返回*/public static String subtract(String v1, String v2) {if (StringUtils.isEmpty(v1)) v1 = "0";if (StringUtils.isEmpty(v2)) v2 = "0";BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.subtract(b2).toString();}/*** 提供精确的减法运算** @param v1* @param v2* @param scale 表示需要精确到小数点以后几位。* @return 两个参数数学差,以字符串格式返回*/public static String subtract(String v1, String v2, int scale) {return round(subtract(v1, v2), 2);}/*** 提供精确的乘法运算。** @param v1* @param v2* @param scale 表示需要精确到小数点以后几位。* @return 两个参数的积*/public static double multiply(double v1, double v2, int scale) {return round(multiply(v1, v2), scale);}/*** 提供精确的乘法运算。** @param v1* @param v2* @return 两个参数的积*/public static double multiply(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2).doubleValue();}/*** 提供精确的乘法运算** @param v1* @param v2* @param scale 表示需要精确到小数点以后几位。* @return 两个参数的数学积,以字符串格式返回*/public static String multiply(String v1, String v2, int scale) {return round(multiply(v1, v2), scale);}/*** 提供精确的乘法运算** @param v1* @param v2* @return 两个参数的数学积,以字符串格式返回*/public static String multiply(String v1, String v2) {if (StringUtils.isEmpty(v1)) v1 = "0";if (StringUtils.isEmpty(v2)) v2 = "0";BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.multiply(b2).toString();}/*** 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到* <p>* 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN** @param v1* @param v2* @return 两个参数的商*/public static double divide(double v1, double v2) {return divide(v1, v2, DEFAULT_DIV_SCALE);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指* <p>* 定精度,以后的数字四舍五入。舍入模式采用ROUND_HALF_EVEN** @param v1* @param v2* @param scale 表示需要精确到小数点以后几位。* @return 两个参数的商*/public static double divide(double v1, double v2, int scale) {return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指* <p>* 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式** @param v1* @param v2* @param scale      表示需要精确到小数点以后几位* @param round_mode 表示用户指定的舍入模式* @return 两个参数的商*/public static double divide(double v1, double v2, int scale, int round_mode) {if (scale < 0) {throw new IllegalArgumentException("小数点后保留几位必须整数或0");}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.divide(b2, scale, round_mode).doubleValue();}/*** 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到* <p>* 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN** @param v1* @param v2* @return 两个参数的商,以字符串格式返回*/public static String divide(String v1, String v2) {if (StringUtils.isEmpty(v1)) v1 = "0";if (StringUtils.isEmpty(v2) || Double.parseDouble(v2) == 0) v2 = "1";return divide(v1, v2, DEFAULT_DIV_SCALE);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指* <p>* 定精度,以后的数字四舍五入。舍入模式采用ROUND_HALF_EVEN** @param v1* @param v2* @param scale 表示需要精确到小数点以后几位* @return 两个参数的商,以字符串格式返回*/public static String divide(String v1, String v2, int scale) {if (StringUtils.isEmpty(v2) || Double.parseDouble(v2) == 0) v2 = "1";return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指* <p>* 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式** @param v1* @param v2* @param scale      表示需要精确到小数点以后几位* @param round_mode 表示用户指定的舍入模式* @return 两个参数的商,以字符串格式返回*/public static String divide(String v1, String v2, int scale, int round_mode) {if (scale < 0) {throw new IllegalArgumentException("小数点后保留几位必须整数或0");}BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.divide(b2, scale, round_mode).toString();}/*** 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_EVEN** @param v     需要四舍五入的数字* @param scale 小数点后保留几位* @return 四舍五入后的结果*/public static double round(double v, int scale) {return round(v, scale, BigDecimal.ROUND_HALF_EVEN);}/*** 提供精确的小数位四舍五入处理** @param v          需要四舍五入的数字* @param scale      小数点后保留几位* @param round_mode 指定的舍入模式* @return 四舍五入后的结果*/public static double round(double v, int scale, int round_mode) {if (scale < 0) {throw new IllegalArgumentException("小数点后保留几位必须整数或0");}BigDecimal b = new BigDecimal(Double.toString(v));return b.setScale(scale, round_mode).doubleValue();}/*** 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_EVEN** @param v     需要四舍五入的数字* @param scale 小数点后保留几位* @return 四舍五入后的结果,以字符串格式返回*/public static String round(String v, int scale) {return round(v, scale, BigDecimal.ROUND_HALF_EVEN);}/*** 提供精确的小数位四舍五入处理** @param v          需要四舍五入的数字* @param scale      小数点后保留几位* @param round_mode 指定的舍入模式* @return 四舍五入后的结果,以字符串格式返回*/public static String round(String v, int scale, int round_mode) {if (scale < 0) {throw new IllegalArgumentException("小数点后保留几位必须整数或0");}BigDecimal b = new BigDecimal(v);return b.setScale(scale, round_mode).toString();}
}

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

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

相关文章

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器安装Prometheus数据可视化监控

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

二、设置三台虚拟机的内存、MAC地址、IP地址

目录 1、配置内存 2、配置MAC地址 2.1 配置node2的MAC地址

【Spark 基础】-- 序列化和反序列化

一、前言 关于序列化和反序列化的定义,在这篇文章中有详细介绍,此处简要说明: 序列化:将对象写入到 IO 流中 反序列化:从 IO 流中恢复对象 我们也可以借助下图来理解序列化和反序列化的过程。 二、Spark 的序列化器 Spark 提供了 2 个序列化库 (Java serializati…

Notepad++ 安装TextFx插件失败

据说TextFx插件是Notepad常用插件之一&#xff1b;有很多格式化代码的功能&#xff1b;下面安装一下&#xff1b; 插件管理里面看一下&#xff0c;没有这个TextFx&#xff1b; 根据资料&#xff0c;先安装NppExec&#xff1b; 然后下一个5.9老版本的Notepad&#xff0c;如下图…

二叉树(判断是否为平衡二叉树)

题目&#xff08;力扣&#xff09;&#xff1a; 观察题目&#xff0c;发现最重要的条件就是&#xff0c;两颗子树的高度差的绝对值不超过1&#xff0c;我们就可以用递归将所有左子树和右子树都遍历一个&#xff0c;求出他们的高度差&#xff0c;若差值 > 1&#xff0c;则返回…

分布式搜索引擎elasticsearch(一)

5.1 初始elasticsearch elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。 5.1.1正向索引 5.1.2elasticsearch采用倒排索引: 文档(document):每条数据就是一个…

Word 在页眉或页脚中设置背景颜色

目录预览 一、问题描述二、解决方案三、参考链接 一、问题描述 如何在word的页眉页脚中设置背景色&#xff1f; 二、解决方案 打开 Word 文档并进入页眉或页脚视图。在 Word 2016 及更高版本中&#xff0c;你可以通过在“插入”选项卡中单击“页眉”或“页脚”按钮来进入或者…

883重要知识点

&#xff08;1&#xff09;程序结构分三种&#xff1a;顺序结构&#xff0c;选择结构&#xff0c;循环结构。 &#xff08;2&#xff09;该程序都要从main&#xff08;&#xff09;开始&#xff0c;然后从最上面往下。 &#xff08;3&#xff09;计算机的数据在电脑中保存以二…

CeresPCL 拟合椭圆(2D)

文章目录 一、简介二、实现代码三、实现效果一、简介 与之前相同,我们首先需要构建我们的问题: (1)构建代价函数。假设我们得到了一组数据,也知晓该数据是用曲线方程: y = a x 3 + b x 2 + c x +

clickhouse从mysql同步数据到clickhouse的几种方式

背景 我们的业务数据一般来说都是放在Mysql中的&#xff0c;而我们要分析的数据一般都存放在clickhouse中&#xff0c;所以如何把数据从mysql同步到ck&#xff0c;就变成了一个必须的步骤&#xff0c;本文简单记录下几种同步的方式 mysql数据同步到clickhouse 方式一&#x…

供水管网PDD模型源程序matlab

function [pop5,leak1,bestobj,H,dtemp]PDDmoni(J,QL) nmaxnum100; %进化代数 popsize100; %种群大小 chromlength18;%染色体数组长度 pc0.8; %交叉概率 pm0.05; %变异概率 node_count17; %节点数 pressure zeros(popsize,node_count); %…

idea使用问题(idea相关)快捷键及窗口没有service

idea快捷键 •万能键&#xff1a;ALTENTER •运行当前文件&#xff1a;CTRLSHIFTF10 •运行上次&#xff1a;SHIFTF10 •以DEBUG模式运行上次&#xff1a;SHIFTF9 •选择运行&#xff1a;ALTSHIFTF10 •选择以DEBUG模式运行&#xff1a;ALTSHIFTF9 •搜索全部&#xff1…

SASE:网络与安全的未来之路

随着数字化时代的到来&#xff0c;企业和个人对网络连接和安全性的需求日益增长。传统的网络架构已经无法满足这些需求&#xff0c;因此&#xff0c;新兴的网络和安全框架SASE&#xff08;Secure Access Service Edge&#xff09;应运而生。本文将介绍什么是SASE&#xff0c;并…

layui+ssm实现数据批量删除

layuissm实现数据的批量删除 //数据表格table.render({id: adminList,elem: #adminList,url: ctx "/admin/getAdminList", //数据接口cellMinWidth: 80,even: true,toolbar: #toolbarDemo,//头部工具栏limit: 10,//每页条数limits: [10, 20, 30, 40],defaultToolba…

【华为OD题库-060】增强的strstr-java

题目 c语言有一个库函数: char* strstr(const char * haystack,const char *needle)&#xff0c;实现在字符串 haystack 中查找第一次出现字符串needle的位置&#xff0c;如果未找到则返回null。 现要求实现一个strstr的增强函数&#xff0c;可以使用带可选段的字符串来模糊查询…

1. 了解继承的概念,掌握派生类的定义。2. 掌握派生类构造方法的执行过程。3. 掌握方法的重载与覆盖。4. 掌握抽象类的概念及上转型对象的使用

1、定义一个抽象类Shape&#xff0c;类中封装属性name指定图形名称&#xff0c;定义用于求面积的抽象方法。定义3个子类&#xff1a;圆形类Circle、梯形类Trapezoid和三角形类Triangle&#xff0c;都继承Shape类&#xff0c;子类中各自新增属性&#xff0c;定义构造方法、设置属…

无人机语音中继电台 U-ATC118

简介 甚高频无线电中继通讯系统使用经过适航认证的机载电台连接数字网络传输模块&#xff0c;通过网络远程控制无缝实现无人机操作员与塔台直接语音通话。无人机操作员可以从地面控制站远程操作机载电台进行频率切换、静噪开关、PTT按钮&#xff0c;电台虚拟面板与真实面板布局…

网络可信空间|探讨现有网络安全中可信空间建设问题,以及建设可信空间的关键要素

网络可信空间的构建能力&#xff0c;基于不同的等级或程度统一面临的一个共同的挑战&#xff0c;即是成本和管理的压力的问题。因此&#xff0c;根据业务用户环境的不同情况&#xff0c;构建适合的等级可信空间&#xff0c;同时保障在不同等级可信空间的安全互通是关键策略。在…

重塑生成式AI时代数据战略,亚马逊云科技re:Invent大会Swami主题演讲

re:lnvent 2023 Swami Sivasubramanian主题演讲&#xff0c;数据、AI和人类共进共生&#xff0c;重塑生成式AI时代的数据战略。 赋能人才加持生成式AI必备能 生成式AI创新中心&#xff1a;解决生成式AI工程化挑战。 Amazon Bedrock平台PartyRock&#xff1a;生成式AI应用程序实…

【Filament】Filament环境搭建

1 前言 Filament 是一个实时物理渲染引擎&#xff0c;用于 Android、iOS、Linux、macOS、Windows 和 WebGL 平台。该引擎旨在提供高效、实时的图形渲染&#xff0c;并被设计为在 Android 平台上尽可能小而尽可能高效。Filament 支持基于物理的渲染&#xff08;PBR&#xff09;&…