为什么不能使用bigdecimal的equals比较大小

news2024/11/30 6:38:54

BigDecimal,相信对于很多人来说都不陌生,很多人都知道他的用法,这是一种 java.math 包中提供的一种可以用来进行精确运算的类型。

很多人都知道,在进行金额表示、金额计算等场景,不能使用 double、float 等类型,而是要使用对精度支持的更好的 BigDecimal。

所以,很多支付、电商、金融等业务中,BigDecimal 的使用非常频繁。而且不得不说这是一个非常好用的类,其内部自带了很多方法,如加,减,乘,除等运算方法都是可以直接调用的。

除了需要用 BigDecimal 表示数字和进行数字运算以外,代码中还经常需要对于数字进行相等判断。

关于这个知识点,在最新版的《阿里巴巴 Java 开发手册》中也有说明:

这背后的思考是什么呢?

我在之前的 CodeReview 中,看到过以下这样的低级错误:

 

if(bigDecimal == bigDecimal1){
    // 两个数相等
}

这种错误,相信聪明的读者一眼就可以看出问题,因为 BigDecimal 是对象,所以不能用 == 来判断两个数字的值是否相等。

以上这种问题,在有一定的经验之后,还是可以避免的,但是聪明的读者,看一下以下这行代码,你觉得他有问题吗:

可以明确的告诉大家,以上这种写法,可能得到的结果和你预想的不一样!

先来做个实验,运行以下代码:

BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);
System.out.println(bigDecimal.equals(bigDecimal1));

BigDecimal bigDecimal2 = new BigDecimal(1);
BigDecimal bigDecimal3 = new BigDecimal(1.0);
System.out.println(bigDecimal2.equals(bigDecimal3));

BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal5 = new BigDecimal("1.0");
System.out.println(bigDecimal4.equals(bigDecimal5));

以上代码,输出结果为:

true
true
false

 BigDecimal 的 equals 原理

通过以上代码示例,我们发现,在使用 BigDecimal 的 equals 方法对 1 和 1.0 进行比较的时候,有的时候是 true(当使用 int、double 定义 BigDecimal 时),有的时候是 false(当使用 String 定义 BigDecimal 时)。

那么,为什么会出现这样的情况呢,我们先来看下 BigDecimal 的 equals 方法。

在 BigDecimal 的 JavaDoc 中其实已经解释了其中原因:

Compares this  BigDecimal with the specified Object for equality.  Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by  this method)

 大概意思就是,equals 方法和 compareTo 并不一样,equals 方法会比较两部分内容,分别是值(value)和标度(scale)

总结
BigDecimal 是一个非常好用的表示高精度数字的类,其中提供了很多丰富的方法。

但是,他的 equals 方法使用的时候需要谨慎,因为他在比较的时候,不仅比较两个数字的值,还会比较他们的标度,只要这两个因素有一个是不相等的,那么结果也是 false、

如果读者想要对两个 BigDecimal 的数值进行比较的话,可以使用 compareTo 方法。

备注:
在 Java 中,== 比较的是对象引用,而 equals 比较的是值。所以,在这个例子中,不同的对象有不同的引用,所以在进行比较的时候都将返回 false。奇怪的是,这里两个类似的 if 条件判断返回不同的布尔值。

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

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

相关文章

一键登陆了解一下

我们先来看一下目前的一些登录方式: 账号、密码登陆 使用账号加密码是最传统的登录方式,可以说是简单粗暴的,一般也不会出现什么问题。 缺点 但这种方式要求用户要记住自己的账号和密码,也就是有一个记忆成本。用户为了降低记忆…

【Tryhackme】KoTH Food CTF(前端验证绕过,图片隐写,SUID提权:vim.basic)

免责声明 本文渗透的主机经过合法授权。本文使用的工具和方法仅限学习交流使用,请不要将文中使用的工具和渗透思路用于任何非法用途,对此产生的一切后果,本人不承担任何责任,也不对造成的任何误用或损害负责。 服务发现 ┌──(r…

学习管理系统五大好处

正如我们先前提到过的,对于公司来说,建立“学习型文化”可以带来许许多多的好处。然而,企业规模会越来越大,员工的培训学习需求并不会减少,这也会为企业的员工培训带来压力。学习管理系统(LMS)可…

GCSE英语语言考试-对虚构小说的问题作答

How to analyse a fiction extract 如何分析虚构小说节选 In an analytical response, you should show how language and structure create meaning. You could also explore the effect on the reader. An analytical response uses evidence from the text to make clear po…

教育培训机构教学课程内容视频加密是如何做的?

阿酷TONY / 2022-12-13 / 长沙 / 原创组图 / 内容含实测链接可测效果 教育培训机构教学课程内容视频加密是如何做的?教育机构的web课程视频加密是如何实现的?主要通过以下的一些方式来实现: 目录: 1、VRM加密 2、播放器加密…

年终总结才是职场人的天花板,学会这4个技巧,让绩效轻松翻倍

作为2022年的最后一个月,不少人正在或即将的年终总结怎么写愁掉了头发。今天老李就给大家分享几个如何做出领导爱看,绩效翻倍的年终总结的方法或套路。 方法一:列完大纲再填充 很多人一上来就罗列工作内容,写到最后看着字数不少…

在小程序中如何使用svg图标

1.首先找到一个能够下载svg图标的网站,例如iconfont或iconpark。 Tip:图标网址iconpark:ByteDance IconPark 2.选择好点击批量下载,下载一个压缩包。将下载后的压缩包解压之后就是我们选择下载的svg文件。如下图 3.打开将svg文件转成base64的…

RabbitMQ的发布确认

文章目录前言:为什么要用发布确认一、发布确认原理二、发布确认的策略2.1 开启发布确认的方法2.2 单个确认发布2.3 批量确认发布2.4 异步确认发布如何处理异步未确认消息以上 3 种发布确认速度对比前言:为什么要用发布确认 答:持久化章节中&…

在word文档表中插入图片不变形

在word文档表中插入图片不变形 目录 在word文档表中插入图片不变形 1、点击左上角【全选图标 】选中表格,鼠标右键点击【表格属性】 2、点击【选项】点击 取消勾选【自动重调尺寸以适应内容】,最后点击【确定】 ​3、依次点击【插入】【图片】点击图片…

【TSP问题】基于蜜蜂算法求解旅行商问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

安全数据资产统一管理

安全数据资产 统一管理DataOps,即 Data 和 Operations 的集成,于 2014 年首次提出。Gartner 将 DataOps 定义为“一种协作性的数据管理 实践,专注于改进组织内数据管道的通信、集成和自动化”[7]。DataOps 是一种面向流程的自动化方法&#x…

U盘被写保护怎么解除?解决方案只需这几个

U盘写保护是一种物理开关保护功能,用于防止存储介质上的数据被错误删除或者写入。如果你想去掉“写保护”,u盘被写保护怎么解除?看看下面的解决方案是怎么说的,赶紧跟随下面去掉U盘写保护的步骤来操作吧! 方案一&#…

基于opencv传统数字图像处理实现车道线检测详细过程(附源码)

车道线检测 (Lane Detection) 1、实验内容 本实验使用数字图像处理的基本方法,构建了一个车道线检测模型。该模型可以识别图像中所有的车道线,并得到完整的车道线信息。模型在tuSimple Lane Dataset大小为100的数据子集进行了测…

餐饮门店数字化转型|餐厅管理系统小程序

餐饮行业规模非常庞大,每年都有大量公司或个体户入局,国内各类美食非常多,不同品类菜品都有大量需求,以前几乎在业的餐饮门店,只要运营得当,挣多挣少总归是有利的,也能很好的生存下去&#xff0…

nodejs+vue大学生交流互动论坛网站系统

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 系统分为不同的层次:视图层(vue页面&…

【云计算与大数据技术】Bloom Filter、LSM树、Merkle哈希树、Cuckoo哈希等数据结构的讲解(图文解释 超详细)

一、重要数据结构与算法 分布式存储系统中存储大量的数据,同时需要支持大量的上层读/写操作,为了实现高吞吐量,设计和实现一个良好的数据结构能起到相当大的作用 这是以下三个数据库使用的数据结构,一个良好的数据结构对于分布式系统来说有…

Swift 周报 第十九期 |技术汇总

前言 本期是 Swift 编辑组自主整理周报的第十期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。 十期磨一剑,废铁亦有形&am…

使用TensorFlow Probability实现最大似然估计

TensorFlow Probability是一个构建在TensorFlow之上的Python库。它将我们的概率模型与现代硬件(例如GPU)上的深度学习结合起来。 极大似然估计 最大似然估计是深度学习模型中常用的训练过程。目标是在给定一些数据的情况下,估计概率分布的参数。简单来说&#xff0…

开源依赖项管理指南

就像人际关系中人与人之间的关系一样,软件生态系统中包含一个庞大的关系网络。其中一些联系非常深入,而有一些关系则更为表面。但实际上,现代基于开源的软件开发涉及一个极其庞大的依赖关系树,依赖关系层层叠加,同时涉…

喜讯丨创新微MinewSemi的MS11SF1系列荣获2022中国IoT创新奖—产品金狮奖

北京时间2022年12月8日,由知名电子科技媒体“电子发烧友”举办的2022第九届中国IoT大会在深圳圆满落幕,创新微MinewSemi凭借高性能、低功耗的WiFiBLE Combo 模块—MS11SF1系列,在众多参会嘉宾和行业主流媒体的共同见证下,荣获2022…