Java——记录BigDecimal与0比较的一个坑

news2025/2/6 0:59:05

文章目录

  • 前言
  • 问题解决
  • 问题解决

前言

在之前做的一个项目中,为了保证BigDecimal除数 divide时,如果被除数为0,出现java.lang.ArithmeticException: / by zero 报错问题,写了一个对比。具体代码如下:

public static BigDecimal getScale(BigDecimal data1,BigDecimal data2,Integer scale){
    if(Objects.isNull(data1) || BigDecimal.ZERO.equals(data1)
        || Objects.isNull(data2) || BigDecimal.ZERO.equals(data2)){
        return BigDecimal.ZERO;
    }
    return data1.divide(data2,scale,BigDecimal.ROUND_HALF_UP);
}

咋一看,的确没毛病。

当被除数为0时,直接由判断返回,并不会进入下面的计算流程。

但,却忽略了一个问题,如果数据是从数据库中查询,数据库中设定的数的格式是0.00时,此时完美绕开了判断。

原因就在于:

new BigDecimal("0.00").equals(BigDecimal.ZERO)false

问题解决

其实这类问题,很好解决,在BigDecimal源码中,有一个compareTo的方法
在这里插入图片描述
简单写个demo,验证效果:

System.out.println(new BigDecimal("0.0").compareTo(BigDecimal.ZERO));
System.out.println(new BigDecimal("0.00").compareTo(BigDecimal.ZERO));
System.out.println(new BigDecimal("0.0000000").compareTo(BigDecimal.ZERO));

System.out.println(new BigDecimal("0").compareTo(BigDecimal.ZERO));

System.out.println(new BigDecimal("0.1").compareTo(BigDecimal.ZERO));

分别打印上面的执行结果,可以发现
在这里插入图片描述
不管是什么格式的0,与0相等则返回0;比0大则返回1;比0小则返回-1。

问题解决

通过compareTo就能解决不同格式的零值,与0使用equals相比为false的问题。

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

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

相关文章

Promise(一) 介绍及基本使用+API

目录 1.Promise 的理解和使用 1.1. Promise 是什么? 1.1.1. 理解 1.2. 为什么要用 Promise? 1.2.1. 指定回调函数的方式更加灵活 1.2.2. 支持链式调用, 可以解决回调地狱问题 1.3 promise初体验 1.4 Promise实践练习——fs读取文件 1.5 Promise实践练习——Ajax请求…

论文精讲 | 一种隐私保护边云协同训练

作者:王森、王鹏、姚信、崔金凯、胡钦涛、陈仁海、张弓 |单位:2012实验室理论部 论文标题 MistNet: Towards Private Neural Network Training with Local Differential Privacy 论文链接 https://github.com/TL-System/plato/blob/main/…

安装MYSQL 社区版 mysql 8.0.30

https://dev.mysql.com/downloads/ 上面地址下载 安装社区版,选择开发者选项 mysql社区版 8.0.30, 直接都下一步,下一步的安装 安装进度一直在显示 安装完成, 下一步 开发者 输入密码: 增加用户 sa 又是一番执行 …

Effective C++(一):让自己习惯C++

个人读书记录,不适用教学内容。 目录 条款01:视C为一个语言联邦 条款02:尽量以const,enum,inline替换#define 条款03:尽可能使用const 所谓的"顶层const"和"底层const" const返回…

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.7 Sentinel的线程隔离与Hystix的线程隔离有什么差别

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.7 Sentinel的线程隔离与Hystix的线程隔离有什么差别?54.7.1 Sentinel与Hystix…

计算机毕设Python+Vue学生社团管理(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

基于蓝牙AOA技术的智慧医疗解决方案

1. 应用背景 医院需求分析在医疗体制不断完善的今天,医院的信息化程度已经大大提高,现在的大型医院都已经用上了医院信息系统(HIS),它是医院管理同现代软件技术、网络技术相结合的产物。应用HIS系统后,确实方便了群众就医&#x…

【docker】DockerFile

一、DockerFile dockerfile是用来构建docker镜像的文件!命令参数脚本! 构建步骤: 编写一个dockerfile文件docker build构建成为一个镜像docker run 运行镜像docker push 发布镜像(DickerHub 阿里云镜像仓库!&#x…

【Python机器学习】分类算法任务、分类模型评价指标详解(图文解释)

分类任务 设样本集S{s_1,s_2,…,s_m}包含m个样本,样本s_i(x_i,y_i)包括一个实例x_i和一个标签y_i,实例由n维特征向量表示,即x_i(x_i^(1),x_i^(2),…,x_i^(n))。 在学习过程,分类任务将样本集中的知识提炼出来,形成模…

进程程序替换

文章目录进程程序替换是什么概念原理为什么要进行程序替换如何进行程序替换使用接口execl引入进程创建execvexeclpexecvpexecle进程程序替换是什么 概念 通过之前的学习,我们知道子进程执行的是父进程的代码片段。 如果我们想让创建出来的子进程,执行的…

PPT丑哭了?这个工具做报表上手更简单,效果更酷炫,送40套模板

如果2023年你还做着万年不变的饼图、折线图,你将会再次错失涨薪的机会! 数据有多重要,已经不言而喻,随之而来的是职场对数据分析与展示能力的要求也越来越高。 但是你是不是这种情况?一用图表就只会用饼图、折线图&a…

ice.js 3 的体验优化策略介绍

ice.js 3 已经正式发布,期待更多的业务来使用、验证,一起建设更好的用户体验。ice.js 3 地址:https://v3.ice.work/本文将简单介绍 ice.js 3 中已经落地和正在进行的一些体验优化策略,以供探讨。Chrome 在去年成立了一个名为 Auro…

Allegro如何导出光绘和颜色设置到其它单板上操作指导

Allegro如何导出光绘和颜色设置到其它单板上操作指导 Allegro有个非常强大的功能,支持把光绘设置和颜色设置等等参数从一个PCB导入到另外一块PCB中,如下图 具体操作如下 导出参数设置,file-export选择Parameters

优优绿能冲刺创业板:年营收4.3亿估值25亿 小米是股东

雷递网 雷建平 12月19日深圳市优优绿能股份有限公司(简称:“优优绿能”)日前递交招股书,准备在深交所创业板上市。优优绿能计划募资7亿元,其中,2.7亿元用于深圳市优优绿能股份有限公司充电模块生产基地建设…

[附源码]计算机毕业设计Python二次元信息分享平台的设计及实现(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等…

数商云采购管理系统支付结算功能详解,实现建筑工程企业采购业务智能化管理

建筑工程行业企业过去受技术、场地等限制,一直采用传统的采购方式,再加上整个行业内部信息相对割裂、采购面临层层传播、中间沟通亦面临多层税费等问题,为建筑工程采购工作增添了不少困难。随着互联网时代的发展,在大数据、云计算…

云原生之使用Docker部署Dashdot服务器仪表盘

云原生之使用Docker部署Dashdot服务器仪表盘一、Dashdot介绍二、检查本地系统环境1.检查本地系统版本2.检查docker状态3.检查docker版本三、下载Dashdot镜像四、部署Dashdot应用1.创建安装目录2.创建Dashdot容器3.查看Dashdot容器状态五、访问Dashdot一、Dashdot介绍 Dashdot是…

未来十年,Python将如何发展?

随着人工智能的发展和普及,作为人工智能首选语言的Python,也越来越受到大家的欢迎。可能也有很多同学想知道未来十年,Python会有什么样的发展。如果发展得非常好,就值得我们亲自去机构进行考察试学,值得我们花时间、花…

克隆一个虚拟机

文章目录1、打开虚拟机2、选择要克隆的虚拟机3、选择当前状态4、创建完整克隆(链接克隆会导致本体和克隆体在一些资源上是公用的,不太合适)5、重命名克隆虚拟机的名字,并且更改克隆的虚拟机所在位置7、登录这个虚拟机8、因为两个虚…

[附源码]计算机毕业设计Python防疫物资捐赠(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…