当前位置: 首页 > wzjs >正文

大气宽屏企业网站源码筹备网站建设

大气宽屏企业网站源码,筹备网站建设,国外修图教程网站,做网站维护的是什么人这是一个很细小的知识点,但是很容易被忽略掉,导致系统问题,因此记录下来 问题背景 明明逻辑上看a和b都不为0才会调用除法,但是系统会报错:java.lang.ArithmeticException异常: if (!a.equals(BigDecimal…

这是一个很细小的知识点,但是很容易被忽略掉,导致系统问题,因此记录下来

问题背景

明明逻辑上看a和b都不为0才会调用除法,但是系统会报错:java.lang.ArithmeticException异常:

if (!a.equals(BigDecimal.ZERO) && !b.equals(BigDecimal.ZERO)) {BigDecimal divide = a.divide(b, 2, RoundingMode.HALF_UP);
}

异常截图:
在这里插入图片描述

分析

说明 a.equals(BigDecimal.ZERO)b.equals(BigDecimal.ZERO)同时为false,但是能引起java.lang.ArithmeticException异常的,b为0,所以 b.equals(BigDecimal.ZERO)的判断有误

然后就考虑到如果b的精度不是0,而是0.00,那么 b.equals(BigDecimal.ZERO)是不是会为false?

在 Java 中,BigDecimal 的 equals 方法比较的是值及其精度。

这是因为 BigDecimal.ZERO 表示的数字是 0, 精度(scale)为 0(即没有小数部分)。而 0.00 的精度则为 2,所以它们被认为是不同的对象。以下是示例代码:

BigDecimal b = new BigDecimal("0.00");
System.out.println(b.equals(BigDecimal.ZERO)); // 输出: false

如果想检查一个 BigDecimal 是否为零而不关心精度,使用 compareTo 方法,如下所示:

if (b.compareTo(BigDecimal.ZERO) == 0) {System.out.println("b 是零");
} else {System.out.println("b 不是零");
}

使用 compareTo 方法可以比较值而不考虑精度,这样,对于 0.00 和 0 的比较都是等于零的。

源码分析

这里我们对equals和compareTo的源码进行分析

(1) BigDecimal.equals() 的实现会比较数值和精度(scale):

public boolean equals(Object x) {if (!(x instanceof BigDecimal))return false;BigDecimal xDec = (BigDecimal) x;if (x == this)return true;if (scale != xDec.scale)  // 精度比较return false;long s = this.intCompact;long xs = xDec.intCompact;if (s != INFLATED) {if (xs == INFLATED)xs = compactValFor(xDec.intVal);return (xs == s);} else if (xs != INFLATED)return compactValFor(this.intVal) == xs;return this.inflated().equals(xDec.inflated());
}

关键点:
首先比较精度(scale),如果不相同直接返回false
然后比较数值本身
所以 new BigDecimal("0.00").equals(BigDecimal.ZERO) 会返回false,因为精度不同(2 vs 0)

(2) compareTo 方法源码分析
BigDecimal.compareTo() 的实现:

public int compareTo(BigDecimal val) {// Quick path for equal scale and non-inflated caseif (scale == val.scale) {long xs = intCompact;long ys = val.intCompact;if (xs != INFLATED && ys != INFLATED)return xs != ys ? ((xs > ys) ? 1 : -1) : 0;}int xsign = this.signum();int ysign = val.signum();if (xsign != ysign)return (xsign > ysign) ? 1 : -1;if (xsign == 0)return 0;int cmp = compareMagnitude(val);return (xsign > 0) ? cmp : -cmp;
}

首先会比较符号(signum)
然后使用 compareMagnitude 比较绝对值
不直接比较精度(scale),而是会统一调整后再比较
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) 会返回0,因为数值相同

最佳实践
当需要严格比较两个BigDecimal是否完全相同时(包括精度),使用 equals()
当只需要比较数值大小时,使用 compareTo()
检查是否为0时,推荐使用 compareTo()


文章转载自:

http://wdCjgSqz.wnbtz.cn
http://ev0hDvBH.wnbtz.cn
http://LzmQuOrB.wnbtz.cn
http://CwKfN6HA.wnbtz.cn
http://gI9nXsgQ.wnbtz.cn
http://gy8Tsc7P.wnbtz.cn
http://cbTKAkJT.wnbtz.cn
http://FIPIqaCE.wnbtz.cn
http://viZI1or5.wnbtz.cn
http://KhvPp4dB.wnbtz.cn
http://BTlq1Tab.wnbtz.cn
http://udkW4nc1.wnbtz.cn
http://Pexq7Uk1.wnbtz.cn
http://LZfLxCoX.wnbtz.cn
http://DLu2aWma.wnbtz.cn
http://sjaN7FdM.wnbtz.cn
http://g0SQswtz.wnbtz.cn
http://V9v9XjB8.wnbtz.cn
http://b6E8yJ36.wnbtz.cn
http://0F1tVR46.wnbtz.cn
http://Xgn08k5M.wnbtz.cn
http://ISLbh7aK.wnbtz.cn
http://SDePvjwP.wnbtz.cn
http://HPCag1zZ.wnbtz.cn
http://lAeFo6gj.wnbtz.cn
http://WdXUrwmb.wnbtz.cn
http://ER4HnqBL.wnbtz.cn
http://b4d6DQpz.wnbtz.cn
http://GixD84Qp.wnbtz.cn
http://961zc2px.wnbtz.cn
http://www.dtcms.com/wzjs/656860.html

相关文章:

  • 南昌企业网站开发公司会昌网站
  • 楚天网站建设合同域名创建
  • 网站 用什么数据库门户网站需要哪些人
  • 安康市网站建设公司wordpress php 文件
  • 男女生做内个的网站网站建设开发公司报价
  • 网站需要的技术app软件下载安装到手机
  • 运城做网站方式方法金融公司网站建设模板下载
  • 白之家低成本做网站云南省建设厅网站查询
  • 网站建设中故障分类和排除方法邯郸网站制作哪家强
  • 云南网站推广的目的旅行社网站建设方案论文
  • 怎样提高网站权重郑州博文it培训 网站开发 平面
  • 榆林网站seo圣都家居装饰有限公司
  • 做口腔科网站石狮网站建设费用
  • 企业门户网站建设与发展住建局查询系统
  • 如何做公众号影视网站wordpress 菜单栏插件
  • 湖北住房和城乡建设厅网站网站访问量统计代码怎么做
  • 做英文小说网站店铺设计图片
  • 成都建站培训佛山网站优化搜索
  • seo优化网站多少钱简述什么叫市场营销
  • 沈阳网站开发工程师招聘网xml网站地图格式
  • 赤峰网站制作公司网页设计制作公司价格便宜
  • 二手书籍交易网站开发方式做网站网页维护手机App开发
  • 建设网站方面的知识论坛推广方案
  • 建网站哪家好网站怎么做json数据
  • 石家庄网站制作机构wordpress 密码明文
  • 聊城做网站的公司流程商标备案查询官网
  • 湘潭建网站外贸没有公司 如何做企业网站
  • 门户网站域名是什么意思郑州建站网站的公司
  • 高端网站设计多少钱大气物流网站源码
  • 南京做网站工作室wordpress适应大数据