Java中BigDecimal的equals与compareTo的区别

有个是否为零的判断【BigDecimal.ZERO.equals(ratio)】我用了BigDecimal的equals方法,结果,判断失败,因此特地分析一下equals与compareTo的区别。本文参考JAVA_VERSION="1.7.0"。首先看一下BigDecimal的equals方法源码:

public int compareTo(BigDecimal val) {
        // Quick path for equal scale and non-inflated case.
        if (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;
    }

可以看到BigDecimal的equals方法是先判断数据类型,在数据类型一致的前提下再判断精确度(scale)和值(BigInteger的equals方法)是否一致。

其实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).”只是自己没有去注意罢了!再看一下compareTo方法源码:

public int compareTo(BigDecimal val) {
        // Quick path for equal scale and non-inflated case.
        if (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;
    } 

可以看到这个方法里面有个compareMagnitude的处理,把val转换为int,然后再进行比较,这里省略compareMagnitude的实现。

signum()方法,返回该数值的正负号,正数,0,负数分别对应返回结果:1,0,-1;举个栗子:

BigDecimal ratio = new BigDecimal("0.00");
if (0 == BigDecimal.ZERO.compareTo(ratio)) {
    System.out.println("二者相等");
}

if (!BigDecimal.ZERO.equals(ratio)) {
     System.out.println(" 居然不相等 ");
}  

结论:对于BigDecimal的大小比较,equals方法不仅比较值的大小,还比较两个对象的精确度,而compareTo方法则不比较精确度,只比较数值的大小。

Reference

https://blog.csdn.net/qq_15037231/article/details/80666072

原文地址:https://www.cnblogs.com/east7/p/11708209.html

时间: 2024-08-28 19:37:13

Java中BigDecimal的equals与compareTo的区别的相关文章

java 中字符串比较equals()和equalsIgnoreCase()的区别

1.使用equals( )方法比较两个字符串是否相等 boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比较的字符串(String)对象. 如果两个字符串具有相同的字符和长度,它返回true,否则返回false.这种比较是区分大小写的. 2.为了执行忽略大小写的比较,可以调用equalsIgnoreCase( )方法.当比较两个字符串时,它会认为A-Z和a-z是一样的. boolean equalsIgnoreCase(String st

JAVA中字符串比较equals()和equalsIgnoreCase()的区别

1.使用equals( )方法比较两个字符串是否相等.它具有如下的一般形式: boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比较的字符串(String)对象.如果两个字符串具有相同的字符和长度,它返回true,否则返回false.这种比较是区分大小写的. 2.为了执行忽略大小写的比较,可以调用equalsIgnoreCase( )方法.当比较两个字符串时,它会认为A-Z和a-z是一样的.其一般形式如下: boolean equalsI

转-- JAVA中字符串比较equals()和equalsIgnoreCase()的区别

1.使用equals( )方法比较两个字符串是否相等.它具有如下的一般形式: boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比较的字符串(String)对象.如果两个字符串具有相同的字符和长度,它返回true,否则返回false.这种比较是区分大小写的. 2.为了执行忽略大小写的比较,可以调用equalsIgnoreCase( )方法.当比较两个字符串时,它会认为A-Z和a-z是一样的.其一般形式如下: boolean equalsI

Java中BigDecimal的8种舍入模式是怎样的

Java中BigDecimal的8种舍入模式是怎样的?下面长沙欧柏泰克软件学院和大家一起来学习下吧:  java.math.BigDecimal 不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成. 如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以10的负scale次幂. 因此,BigDecimal表示的数值是(unscaledValue × 10-scale). 与之相关的还有两个类: java.ma

Java中的==和equals方法详解

Java中的==和equals   1.如果比较对象是值变量:只用== 2.如果比较对象是引用型变量: ==:比较两个引用是不是指向同一个对象实例. equals: 首先Object类中equals的实现是直接调用了==操作. 一个自定义类继承自Object且没有重写equals方法,那么其equals操作也是与Object类一样,仅仅是直接调用==操作. 如果一个类重写过equals方法(或者继承自一个重写过equals方法的类),那么效果与==操作不同 如果是你自己定义的一个类,比较自定义类

Java中的==和equals区别

引言:从一个朋友的blog转过来的,里面解决了两个困扰我很久的问题.很有久旱逢甘霖的感觉. 中软国际电子政务部Jeff Chi总结,转载请说明出处. 概述:        A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同:当用于引用类型的时候,是比较对象是否相同.        B.对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的.        C.基本类型没有equals方法,equals只比较值(对象中的

java中的==、equals()、hashCode()源码分析(转载)

在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 String s2 = "nihao"; 5 Str

java中的==、equals()、hashCode()

java中的==.equals().hashCode()源码分析 在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 Str

java中的==和equals的区别

关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指正,谢谢. 在JAVA程序中一般的基本类型(值类型int,double,boolean等)都只能通过 = = 来判断值是否相等. 如:System.out.println(1==1);System.out.println(true==true);√ 不能写成System.out.println(1.