精华内容
下载资源
问答
  • BigDecimal比较大小问题

    千次阅读 2018-05-22 16:35:23
    BigDecimal比较大小 这个类是Java里精确计算的类,下面说一下两个BigDecimal对象大小,相等的判断 1比较对象是否相等 一般的对象用于等于,但是BigDecimal比较特殊,举个例子: BigDecimal a = BigDecimal.value...

    BigDecimal比较大小
       这个类是Java里精确计算的类,下面说一下两个BigDecimal对象大小,相等的判断
       1比较对象是否相等
         一般的对象用于等于,但是BigDecimal比较特殊,举个例子:
         BigDecimal a = BigDecimal.valueOf(1.0); 
         BigDecimal b = BigDecimal.valueOf(1.000); 

         在现实中这两个数字是相等的,但是如果用a.equals 
         (b)结果是假的;怎么不相等了呢?因为等于是比较内容,“1.0”和“1.000”当然不一样了

         解决办法:

                if(a.compareTo(b)== 0)结果是true

    compareTo就是比较两个值,如果前者大于后者,返回1,等于返回0,小于返回-1,我下面给出了例子,由于比较的变量我用的是int,int型可以直接比较,所有没有用到compareTo比较,如果声明的是Date、String、Integer或者其他的,可以直接使用compareTo比较,


    /**
     * Compares this {@code BigDecimal} with the specified
     * {@code BigDecimal}.  Two {@code BigDecimal} objects that are
     * equal in value but have a different scale (like 2.0 and 2.00)
     * are considered equal by this method.  This method is provided
     * in preference to individual methods for each of the six boolean
     * comparison operators ({@literal <}, ==,
     * {@literal >}, {@literal >=}, !=, {@literal <=}).  The
     * suggested idiom for performing these comparisons is:
     * {@code (x.compareTo(y)} <<i>op</i>> {@code 0)}, where
     * <<i>op</i>> is one of the six comparison operators.
     *
     * @param  val {@code BigDecimal} to which this {@code BigDecimal} is
     *         to be compared.
     * @return -1, 0, or 1 as this {@code BigDecimal} is numerically
     *          less than, equal to, or greater than {@code val}.
     */
    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;
    }

    转自: 百度~( 千篇一律,感谢广大网友 )

    展开全文
  • 比较大小的时候最好不要使用new BigDecimal(xx)来比较,而应该使用BigDecimal.valueOf(xx);  原因是new BigDecimal(double)是利用的double构造方法,该构造方法有一定的不可预料性;  比如比较一个值是否等于100 ...

    比较大小的时候最好不要使用new BigDecimal(xx)来比较,而应该使用BigDecimal.valueOf(xx); 
    原因是new BigDecimal(double)是利用的double构造方法,该构造方法有一定的不可预料性; 
    比如比较一个值是否等于100

    xx.compareTo(new BigDecimal(100)) == 0//不建议
    xx.compareTo(BigDecimal.valueOf(100)) == 0//建议
    展开全文
  • java BigDecimal 遇到的坑 BigDecimal 注意点事项 BigDecimal 比较大小 一、遇到问题 在使用 java.math包的 BigDecimal类进行高精确度运算时,发现在使用构造方法 new BigDecimalBigDecimal.valueOf 方法...

      java BigDecimal 遇到的坑 BigDecimal 注意点事项 BigDecimal 比较大小

     

     

    一、遇到问题

    在使用 java.math包的 BigDecimal类进行高精确度运算时,发现在使用构造方法 new BigDecimal 和 BigDecimal.valueOf 方法创建的 BigDecimal对象居然不相等的情况,此处容易暗生bug,且难以发现,故记录一下。

     

    二、代码重现

    1、new BigDecimal 和 BigDecimal.valueOf 方法创建的 BigDecimal对象

    2、输出 BigDecimal 对象

    3、比较地址值

    4、代码如下:

    @Test
    public void test() {
    	double d1 = 0.1D ;
    	double d2 = 0.1D ;
    	BigDecimal b1 = new BigDecimal(d1);
    	BigDecimal b2 = BigDecimal.valueOf(d2);
    		
    	System.out.println(b1);
    	System.out.println(b2);
    	System.out.println(b1 == b2);
    }

     

    5、输出结果如下:

    0.1000000000000000055511151231257827021181583404541015625

    0.1

    false

     

    6、问题: b1 比 b2 多了一串浮点数 ,精度异常。

     

    三、BigDecimal 比较大小

    1、代码如下:

    @Test
    public void compare() {
    	double d1 = 0.1D ;
    	double d2 = 0.1D ;
    	BigDecimal b1 = BigDecimal.valueOf(d1);
    	BigDecimal b2 = BigDecimal.valueOf(d2);
    		
    	System.out.println(b1 == b2);
    	System.out.println(b1.equals(b2));
    	System.out.println(b1.compareTo(b2)); // 返回 int
    }

     

    2、输出结果如下:

    false

    true

    0

     

    3、说明: b1.compareTo(b2):返回 int,

    等于0,则b1=b2;

    等于 1 ,则b1>b2 ;

    等于-1,则b1<b2。

     

     

    四、总结

    1、new BigDecimal()精度异常问题,请自行查阅资料,或者看JDK源码了解。

    2、对于创建BigDecimal对象,请使用 BigDecimal.valueOf(xx)方法,或者 new BigDecimal(String.valueOf(xx))方法。 ---- 原因可查看源码了解。

    3、BigDecimal 比较可以用 compareTo 方法,或者 equals 方法都可以。 --- BigDecimal方法重写了 equals 方法 同时也 实现了 java.lang.Comparable<BigDecimal> 接口。

    4、BigDecimal 实现常见运算(加、减、乘、除)需要使用对应的方法,不能直接对象相加。 --- 请自行查阅JDK文档。

    5、BigDecimal 还可实现保留若干未小数,setScale() 方法 , 请了解一下。

    6、.........更多的,自己去看看呗。

     

     

     

     

     

    展开全文
  • BigDecimal比较大小及判令处理不要使用intValue(),doubleValue(),floatValue()获取基本类型数据后在比较,这样会有精度丢失问题,请使用compareTo 例如: /** -1, 0, or 1 as this BigDecimal is numerically less...

    BigDecimal比较大小及判令处理不要使用intValue(),doubleValue(),floatValue()获取基本类型数据后在比较,这样会有精度丢失问题,请使用compareTo
    例如:

    /**
    -1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
    */
    int isBig = new BigDecimal("0.00001").compareTo(BigDecimal.ZERO);
    

    运行后:isBig 为1

    特别是与整数比较的时候,一定不能使用intValue()来处理,否则当数据为小数的时候,获取的都是0

    展开全文
  • BigDecimal类型比较大小

    2019-09-26 06:55:05
    1 比较对象是否相等 一般的对象用equals,但是BigDecimal比较特殊,举个例子: BigDecimal a=BigDecimal.valueOf(1.0); BigDecimal b=BigDecimal.valueOf(1.000); 在现实中这两个数字是相等的,但是问题来来了 a....
  • 一般的对象用equals,但是BigDecimal比较特殊,举个例子: BigDecimal a=BigDecimal.valueOf(1.0); BigDecimal b=BigDecimal.valueOf(1.000); 在现实中这两个数字是相等的,但是问题来来了 ...
  • 这里写自定义目录标题BigDecimal使用场景为什么要用BigDecimalBigDecimal的compareTo方法做大小判断 BigDecimal使用场景 BigDecimal在订单结算、账单计算场景上使用 为什么要用BigDecimal 不管用什么,都有其中的...
  • 1、比较对象是否相等,一般的对象用equals,但是BigDecimal比较特殊,举个例子 BigDecimal a = new BigDecimal.valueOf(1.0); BigDecimal b = new BigDecimal.valueOf(1.000); 在现实中这两个数字是相等的,但是...
  • compareTo(); a.compareTo(b),返回值为0,表示a=b;返回值为-1,表示a<b;返回值为1,表示a>b;
  • 数据库之中设置了一个Bigdecimal的字段,b
  • 提示:BigDecimal 在使用的过程中尽量采用String类型的参数进行转换尽量避免不使用字符串的数字对小数点进行数据格式的转换,避免出现精准问题。 加法:add()函数 减法:subtract()函数 乘法:multiply()函数 除...
  • Bigdecimal的equals方法不仅仅比较值的大小是否相等,首先比较的是scale(scale是bigdecimal的保留小数点位数,比如 new Bigdecimal(“1.001”),scale为3),也就是说,不但值得大小要相等,保留位数也要相等,...
  • BigDecimal大小比较,1.0与1.00是不相等的,得采用它自带的compareTo方法: java 代码 int i=b1.compareTo(b2) 这一次,返回的i可能为-1、0、1,分别表示小于、等于、大于 构造函数:解决了上面这个问题好像...
  • 特殊格式比较的方法总结 开发中经常与到要比较两值...1.BigDecimal比较大小的方法 BigDecimal不能直接用">","<"比较 例如: @Test public void containsTest() { BigDecimal a =new BigDecimal(0.1); BigDec
  • 项目中涉及到了BigDecimal的加、减、乘、比较大小、精确度的问题。所以在此总结一下,方便以后复习。 1 //加法 2 3 BigDecimal coins = new BigDecimal("0"); 4 5 BigDecimal one = new BigDecimal("1...
  • 钱的计算: 可能会损失精度;  BigDecimal 类进行计算;  ... BigDecimal比较大小问题 BigDecimal 的API使用: public int compareTo(BigDecimal val) 将此 BigDecimal 与指定的 BigDecim...
  • 项目中涉及到了BigDecimal的加、减、乘、比较大小、精确度的问题。所以在此总结一下,方便以后复习。 1 //加法 2 3 BigDecimal coins = new BigDecimal("0"); 4 5 BigDecimal one = new BigDecimal("1"); 6...
  • BigDecimal详解

    2020-10-12 12:51:37
    BigDecimal详解BigDecimal概述BigDecimal常用构造函数常用构造函数使用问题分析BigDecimal常用方法详解常用方法BigDecimal大小比较BigDecimal格式化BigDecimal常见异常除法的时候出现异常BigDecimal总结工具类推荐 ...
  • BigDecimal使用技巧

    2018-10-17 13:56:12
    BigDecimal初始化小数时,要... BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小 BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题,直接调用B...
  • BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题,直接调用BigDecimaldivide(BigDecimal ...
  • * BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小。 * BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题, * 直接调用BigDecim
  • string、long、bigdecimal

    2016-03-02 10:56:02
    1:两个bigdecimal比较大小 一般的对象用equals,但是BigDecimal比较特殊,举个例子:  BigDecimal a=BigDecimal.valueOf(1.0);  BigDecimal b=BigDecimal.valueOf(1.000);  在现实中这两个数字是相等的,但是问题...

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

bigdecimal比较大小问题