为什么要禁止使用BigDecimal的equals方法做等值比较


本文小编为大家详细介绍“为什么要禁止使用BigDecimal的equals方法做等值比较”,内容详细,步骤清晰,细节处理妥当,希望这篇“为什么要禁止使用BigDecimal的equals方法做等值比较”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。BigDecimal 很多人应该听说过它,也知道它的用法,它是java.math包中提供的一种可以用来进行精确运算的类型。很多人都知道,在进行金额表示、金额计算等场景,不能使用doublefloat等类型,而是要使用对精度支持的更好的BigDecimal。所以,很多支付、电商、金融等业务中,BigDecimal的使用非常频繁。而且不得不说这是一个非常好用的类,其内部自带了很多方法,如加,减,乘,除等运算方法都是可以直接调用的。除了需要用BigDecimal表示数字和进行数字运算以外,代码中还经常需要对于数字进行相等判断。那么,为什么会有这样的要求呢?背后的思考是什么呢?其实,我在之前的CodeReview中,看到过以下这样的低级错误:这种错误,相信聪明的读者一眼就可以看出问题,因为BigDecimal是对象,所以不能用==来判断两个数字的值是否相等。以上这种问题,在有一定的经验之后,还是可以避免的,但是聪明的读者,看一下以下这行代码,你觉得他有问题吗:可以明确的告诉大家,以上这种写法,可能得到的结果和你预想的不一样!先来做个实验,运行以下代码:以上代码,输出结果为:通过以上代码示例,我们发现,在使用BigDecimalequals方法对1和1.0进行比较的时候,有的时候是 true(当使用 int、double 定义 BigDecimal 时),有的时候是 false(当使用 String 定义 BigDecimal时)。那么,为什么会出现这样的情况呢,我们先来看下BigDecimalequals方法。在BigDecimal的JavaDoc中其实已经解释了其中原因:大概意思就是,equals方法和compareTo并不一样,equals方法会比较两部分内容,分别是值(value)和精度(scale)所以,我们以上代码定义出来的两个BigDecimal对象(bigDecimal4和bigDecimal5)的精度是不一样的,所以使用equals比较的结果就是false了。尝试着对代码进行debug,在debug的过程中我们也可以看到bigDecimal4的精度是0,而bigDecimal5的精度是1。到这里,我们大概解释清楚了,之所以equals比较bigDecimal4bigDecimal5的结果是 false ,是因为精度不同。那么,为什么精度不同呢?为什么bigDecimal2bigDecimal3的精度是一样的(当使用int、double定义BigDecimal时),而bigDecimal4bigDecimal5却不一样(当使用String定义BigDecimal时)呢?这个就涉及到BigDecimal的精度问题了,这个问题其实是比较复杂的,由于不是本文的重点,这里面就简单介绍一下吧。大家感兴趣的话,后面单独讲。首先,BigDecimal一共有以下4个构造方法:BigDecimal(int)BigDecimal(double)BigDecimal(long)BigDecimal(String)以上四个方法,创建出来的的BigDecimal的精度是不同的。首先,最简单的就是BigDecimal(long) 和BigDecimal(int),因为是整数,所以精度就是0 :而对于BigDecimal(double) ,当我们使用new BigDecimal(0.1)创建一个BigDecimal 的时候,其实创建出来的值并不是正好等于0.1的,而是0.1000000000000000055511151231257827021181583404541015625 。这是因为doule自身表示的只是一个近似值。那么,无论我们使用new Bi免费云主机域名gDecimal(0.1)还是new BigDecimal(0.10)定义,他的近似值都是0.1000000000000000055511151231257827021181583404541015625这个,那么他的精度就是这个数字的位数,即55。其他的浮点数也同样的道理。对于new BigDecimal(1.0)这样的形式来说,因为他本质上也是个整数,所以他创建出来的数字的精度就是0。所以,因为BigDecimal(1.0)BigDecimal(1.00)的精度是一样的,所以在使用equals方法比较的时候,得到的结果就是 true。而对于BigDecimal(double)当我们使用new BigDecimal(“0.1”)创建一个BigDecimal 的时候,其实创建出来的值正好就是等于0.1的。那么他的精度也就是1。如果使用new BigDecimal(“0.10000”),那么创建出来的数就是0.10000,精度也就是5。所以,因为BigDecimal(“1.0”)和BigDecimal(“1.00”)的精度不一样,所以在使用equals方法比较的时候,得到的结果就是false。前面,我们解释了BigDecimalequals方法,其实不只是会比较数字的值,还会对其精度进行比较。所以,当我们使用equals方法判断判断两个数是否相等的时候,是极其严格的。那么,如果我们只想判断两个BigDecimal的值是否相等,那么该如何判断呢?BigDecimal中提供了compareTo方法,这个方法就可以只比较两个数字的值,如果两个数相等,则返回0。以上代码,输出结果:读到这里,这篇“为什么要禁止使用BigDecimal的equals方法做等值比较”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: PHP怎么开启错误提示

这篇“PHP怎么开启错误提示”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP怎么开启错误提示”文章吧。直接在PHP代码中添加:就可以开启错误…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 09/01 07:43
Next 09/01 07:43

相关推荐