Java中加减乘除运算工具类

Java 中的 double 类型不能用于精确的加减乘除运算,这是因为计算机使用二进制来表示浮点数,而二进制无法精确表示所有十进制数。
原因:
浮点数由两部分组成:指数和尾数。指数表示浮点数的大小,尾数表示浮点数的精度。 在计算机中,浮点数的尾数是有限的,这会导致精度损失。例如,十进制数 0.1 在二进制中无法精确表示,只能近似为 0.10000000000000001。
所以:
1、运算浮点数请用BigDecimal,
2、使用 Math 类中的方法进行舍入,例如 Math.round() Math.floor()
3、转化为整数进行运算

工具类如下:

package pers.fz.mvvm.util.common;import android.text.TextUtils;import java.math.BigDecimal;
import java.text.DecimalFormat;/*** Created by fz on 2024/1/8 18:28* describe :*/
public class MathUtil {// 默认精度10, 应该是2,4, 特别是做金额计算,到分和到毫public static final int DEFAULT_SCALE = 10;public static final int DEFAULT_DIV_SCALE = 2;// 默认的格式化字符样式 “#。00”  还可以是像“#。0000”public static final String DEFAULT_FORMAT_STR = "#.00";public static BigDecimal average(String... numbers) {if (numbers == null || numbers.length == 0) {return new BigDecimal("0.00");}BigDecimal sum = BigDecimal.ZERO;for (String str : numbers) {sum = sum.add(TextUtils.isEmpty(str) ? BigDecimal.ZERO : new BigDecimal(str));}BigDecimal count = new BigDecimal(numbers.length);return sum.divide(count, 2, BigDecimal.ROUND_HALF_UP);}// 加法public static BigDecimal add(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2);}// 加法public static BigDecimal add(String v1, String v2) {BigDecimal b1 = TextUtils.isEmpty(v1) ? BigDecimal.ZERO : new BigDecimal(v1);BigDecimal b2 = TextUtils.isEmpty(v2) ? BigDecimal.ZERO : new BigDecimal(v2);return b1.add(b2);}// 加法public static BigDecimal add(String... number) {if (number == null || number.length == 0) {return BigDecimal.ZERO;}BigDecimal zero = BigDecimal.ZERO;for (String num : number) {BigDecimal b2 = TextUtils.isEmpty(num) ? BigDecimal.ZERO : new BigDecimal(num);zero = zero.add(b2);}return zero;}// 减法public static BigDecimal sub(String v1, String v2) {BigDecimal b1 = TextUtils.isEmpty(v1) ? BigDecimal.ZERO : new BigDecimal(v1);BigDecimal b2 = TextUtils.isEmpty(v2) ? BigDecimal.ZERO : new BigDecimal(v2);return b1.subtract(b2);}// 减法public static BigDecimal sub(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.subtract(b2);}// 乘法public static BigDecimal mul(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2);}// 乘法public static BigDecimal mul(String v1, String v2) {BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.multiply(b2);}// 乘法public static BigDecimal mul(String... numbers) {if (numbers == null || numbers.length == 0) {return new BigDecimal("0.00");}BigDecimal sum = BigDecimal.ONE;for (String str : numbers) {sum = sum.multiply(TextUtils.isEmpty(str) ? BigDecimal.ZERO : new BigDecimal(str));}return sum;}// 除法,默认精度public static BigDecimal div(String v1, String v2) {if (NumberUtils.isNullOrZero(v2)) {return BigDecimal.ZERO;}BigDecimal b1 = TextUtils.isEmpty(v1) ? BigDecimal.ZERO : new BigDecimal(v1);BigDecimal b2 = TextUtils.isEmpty(v2) ? BigDecimal.ONE : new BigDecimal(v2);return b1.divide(b2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_UP);}// 除法,默认精度public static BigDecimal div(String v1, String v2, int scale) {if (NumberUtils.isNullOrZero(v2)) {return BigDecimal.ZERO;}if (scale < 0) {scale = DEFAULT_DIV_SCALE;}BigDecimal b1 = TextUtils.isEmpty(v1) ? BigDecimal.ZERO : new BigDecimal(v1);BigDecimal b2 = TextUtils.isEmpty(v2) ? BigDecimal.ONE : new BigDecimal(v2);return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);}// 除法,默认精度public static BigDecimal div(double v1, double v2) {if (v2 == 0) {return BigDecimal.ZERO;}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.divide(b2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_UP);}// 除法,自定义精度public static BigDecimal div(double v1, double v2, int scale) {if (v2 == 0) {return BigDecimal.ZERO;}if (scale < 0) {scale = DEFAULT_DIV_SCALE;}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);}// 对一个double截取指定的长度,利用除以1实现public static BigDecimal round(String v1, int scale) {if (TextUtils.isEmpty(v1)) {return BigDecimal.ZERO;}if (scale < 0) {scale = DEFAULT_DIV_SCALE;}BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal("1");return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);}// 对一个double截取指定的长度,利用除以1实现public static BigDecimal round(double v1, int scale) {if (scale < 0) {scale = DEFAULT_DIV_SCALE;}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal("1");return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);}// 比较2个double值,相等返回0,大于返回1,小于返回-1public static int compareTo(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.compareTo(b2);}// 判断2个double的值相等这里要改,相等返回true,否则返回falsepublic static boolean valuesEquals(double v1, double v2) {boolean result;BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));int resultInt = b1.compareTo(b2);result = resultInt == 0;return result;}// 判断2个double的值,v1大于v2返回true,否则返回falsepublic static boolean valuesGreater(double v1, double v2) {boolean result;BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));int resultInt = b1.compareTo(b2);if (resultInt > 0) {result = true;} else {result = false;}return result;}// 判断2个double的值,v1小于v2返回true,否则返回falsepublic static boolean valuesLess(double v1, double v2) {boolean result;BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));int resultInt = b1.compareTo(b2);if (resultInt < 0) {result = true;} else {result = false;}return result;}// DecimalFormat格式化,使用默认的格式样式public static String format(Object object) {return new DecimalFormat(DEFAULT_FORMAT_STR).format(object);}// DecimalFormat格式化,使用传入的字符串格式样式public static String format(Object object, String formatStr) {return new DecimalFormat(formatStr).format(object);}}

` public static boolean isNullOrZero(String number) {
if (null == number || “”.equals(number) || number.isEmpty()) {
return true;
}
if (“0”.equals(number) || “0.0”.equals(number) || “0.00”.equals(number)) {
return true;
}
if (!RegexUtils.isDouble(number)) {
return false;
}
try {
double d = Double.parseDouble(number);
if (0.0 == d) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}`

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

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

相关文章

八节【DBA从入门到实践】课程,带你快速掌握OceanBase运维管理核心技能

为帮助用户及开发者更好、更快地掌握OceanBase DBA核心技能&#xff0c;OceanBase社区设计了配套教程——“DBA从入门到实践”。8期教程带大家循序渐进掌握OceanBase运维管理核心技能。搭配随堂习题和OceanBase技术专家在线答疑&#xff0c;快速掌握重要知识点&#xff0c;并轻…

【DL经典回顾】激活函数大汇总(二十七)(Bent Identity附代码和详细公式)

激活函数大汇总&#xff08;二十七&#xff09;&#xff08;Bent Identity附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可或…

直观与交互:山海鲸可视化软件与Excel传统表格的对比

作为一名长期使用Excel进行数据处理和分析的用户&#xff0c;最近我尝试了一款名为山海鲸的可视化软件&#xff0c;发现它与Excel传统表格之间存在诸多明显的差异。接下来&#xff0c;我将从个人体验视角出发&#xff0c;谈谈这两种工具的不同之处。 首先&#xff0c;从数据呈…

汇编语言和IBM的关系

一 缺乏汇编的硬件没有灵魂 1964年&#xff0c;在IBM没有发明System 360大型计算机之前&#xff0c;IBM已经发明了很多计算机。如IBM 1952年发布的第一台商用计算机&#xff1a;701计算机。1959年&#xff0c;IBM首次利用晶体管、磁芯存储器、印刷电路技术&#xff0c;发明了小…

家谱系统的app的主要功能介绍

家谱系统的app通常具备一系列功能&#xff0c;这些功能旨在帮助用户更好地记录、管理和分享家族的历史和文化。以下是一些常见的家谱系统app的功能介绍&#xff1a; 家谱查看&#xff1a;用户可以通过app登录自己的账号&#xff0c;查看对应的家谱信息。这包括家族成员的基本信…

组件化开发

一、引言 Vue.js 的组件化开发是其核心特性之一&#xff0c;它允许开发者将复杂的界面拆分为可复用的、独立的、小的组件&#xff0c;从而提高开发效率和代码的可维护性。 二、关键点 1.组件的定义 在components下创建.vue文件timecard.vue用来编辑内容。 文件创建完毕后&am…

Linux Shell中的echo命令详解

Linux Shell中的echo命令详解 在Linux Shell中&#xff0c;echo命令是一个常用的内置命令&#xff0c;用于在终端上显示文本或字符串。它主要用于显示变量的值&#xff0c;创建文件的内容&#xff0c;或者简单地输出一些信息。在本文中&#xff0c;我们将详细探讨echo命令的用…

迷宫问题(c++题解)

题目描述 设有一个 N*N(2<N<10)方格的迷宫&#xff0c;入口和出口分别在左上角和右上角。迷宫格子中 分别放 0 和 1&#xff0c;0 表示可通&#xff0c;1 表示不能&#xff0c;入口和出口处肯定是 0。迷宫走的规则如下所示&#xff1a; 即从某点开始&#xff0c;有八个方…

000_【基础篇】SpringBoot概述

介绍 springboot 是 spring 提供的一个子项目&#xff0c;用于快速构建 spring 应用程序 传统的 SSM 框架要导入很多依赖的 jar 包以及配置很多的配置文件&#xff0c;麻烦、繁琐 springboot 特性 springboot 主要&#xff08;还有其他的一些特性&#xff09;有起步依赖和…

精酿啤酒:开启时尚派对的钥匙

Fendi club啤酒&#xff0c;一个代表着时尚与品味的品牌&#xff0c;如今进入了啤酒市场&#xff0c;推出了名为“Fendi club”的啤酒。这一创新的举措不仅展现了品牌的多元化发展&#xff0c;更为消费者提供了一种全新的时尚生活方式。 Fendi club啤酒不仅仅是一种产品&#x…

柠檬酸行业调研:市场预计将继续保持稳健增长

一、市场趋势 柠檬酸作为一种广泛使用的有机酸&#xff0c;其应用领域包括食品饮料、医药、化妆品和工业清洗等。随着消费者对健康饮食的关注增加&#xff0c;以及工业应用的扩展&#xff0c;柠檬酸的需求有望继续增长。 二、主要竞争者 全球柠檬酸市场的主要生产商包括中国的A…

Java修饰符

目录 1.访问修饰符 2.非访问修饰符 3.应用实例 4.继承与访问控制 5.小结 6.代码示例 public修饰符示例 private修饰符示例 protected修饰符示例 static和final修饰符示例 Java修饰符主要分为访问修饰符和非访问修饰符两大类。通过这些修饰符&#xff0c;可以控制类、…

Linux系统编程

文章目录 1. 文件里面存放了5行数据&#xff0c;使用追加模式打开文件&#xff0c;打印前3行&#xff0c;并写入一行&#xff0c;期间使用ftell打印当前位置。2. 修改文件的权限&#xff0c;注意必须使用命令行参数。3. 使用两种方法打印当前目录。4. 传递一个路径名&#xff0…

【C++庖丁解牛】继承的概念及定义 | 继承中的作用域 | 继承与友元继承与静态成员 | 复杂的菱形继承及菱形虚拟继承

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.继承的概念及定义1.1继…

C++ 中this指针归纳

在C中&#xff0c;this指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向调用该成员函数的对象&#xff0c;使得在成员函数中能够访问到当前对象的数据成员和其他成员函数。以下是关于this指针的一些重要信息&#xff1a; 指针类型&#xff1a;this指针是一个指向当前…

【漏洞复现】用友U8Cloud base64 SQL注入漏洞

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚焦成长型、创新型企业&#xff0c;提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud 存在SQL注入漏洞&#xff0c;未授权的攻击者可通过此漏洞获取数据库权限&#xff0c;从而盗取用户数据&a…

FFmpeg-- c++实现:pcm和yuv编码

文章目录 流程音频视频 api核心代码audioencoder.haudioencoder.cppvideoencoder.hvideoencoder.cpp pcm和yuv编码为aac和h264&#xff0c;封装为c的AudioEncoder类和VideoEncoder类 流程 音频 初始化音频参数 int InitAAC(int channels, int sample_rate, int bit_rate); 音…

KVM安装-kvm彻底卸载-docker安装Webvirtmgr

KVM安装和使用 一、安装 检测硬件是否支持KVM需要硬件的支持,使用命令查看硬件是否支持KVM。如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的 egrep ‘(vmx|svm)’ /proc/cpuinfo关闭selinux将 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改为 SELinux=d…

AI预测福彩3D第13弹【2024年3月19日预测--第3套算法重新开始计算第2次测试】

今天咱们继续对第3套算法进行第2次测试&#xff0c;第3套算法加入了012路的权重。废话不多说了&#xff0c;直接上结果吧~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月19日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a;0 1 3 4 2 7 9&#xff08;6换9&#x…

LCR144翻转二叉树(力扣简单题,Java,递归+非递归)

目录 题目描述&#xff1a; 递归代码1&#xff1a; 递归代码2&#xff1a; 非递归代码&#xff08;层次遍历&#xff09;&#xff1a; 题目描述&#xff1a; 给定一棵二叉树的根节点 root&#xff0c;请左右翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a;…