我是靠谱客的博主 安静火车,最近开发中收集的这篇文章主要介绍关于BigDecimal判断是否为0的逻辑踩坑,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

在写项目的过程中遇到这样一个判断逻辑:判断一个BigDecimal类型的变量的值是否等于0
在没有百度的情况下,常规思路就是调用equals方法去判断是否等于0,也就是下面代码的判断逻辑:

bigdecimal.equals(BigDecimal.ZERO);

但结果却不是所预料的一定为true,然后看该类的equals方法的源码发现判断逻辑不是简单的通过比较两个值是否相等来算出结果

分析

看BigDecimal的equals方法源码

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 xs == compactValFor(this.intVal);

        return this.inflated().equals(xDec.inflated());
    }

这里具体细节就不探讨,我们会发现BigDecimal类的equals方法不仅仅是比较值是否相等,还比较了BigDecimal值的精确度,如果两个BigDecimal对象的精确度如果不一样,即使其值相等,那返回的也是false。
例如下面的代码

Bigdecimal a = new Bigdecimal("0");
Bigdecimal b = new Bigdecimal("0.0");
a.equals(b);

上面代码结果就是返回false
这里说明一点就是,Bigdecimal.ZERO 的 scale 值为 0

结论

所以我们如果要判断 Bigdecimal 对象的值是否等于 0 ,可以使用下面的判断逻辑

Bigdecimal a = new Bigdecimal("0.0");
a.compareTo(BigDecimal.ZERO)==0

通过调用 Bigdecimal 的 compareTo 方法来比较,不管精度是否一样,只要 Bigdecimal 对象的值为 0 ,这个结果就是 true。

最后

以上就是安静火车为你收集整理的关于BigDecimal判断是否为0的逻辑踩坑的全部内容,希望文章能够帮你解决关于BigDecimal判断是否为0的逻辑踩坑所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部