美文网首页
BigDecimal compareTo比较大小

BigDecimal compareTo比较大小

作者: timar | 来源:发表于2019-08-09 17:56 被阅读0次
    BigDecimal b1 = new BigDecimal(0.1);
    BigDecimal b2 = new BigDecimal(0.2);
    int c = b1.compareTo(b2);  // -1
    
    c=1表示b1大于b2
    c=0表示b1等于b2
    c=-1表示b1小于b2
    

    1、0.1 * 0.2 != 0.02

    BigDecimal b1 = new BigDecimal(0.1);
    BigDecimal b2 = new BigDecimal(0.2);
    BigDecimal b3 = new BigDecimal(0.02);
    System.out.println(b1.multiply(b2));  
    System.out.println(b1.multiply(b2).compareTo(b3)); 
    
    打印结果是
    0.0200000000000000022204460492503131424770215565731879227912941627176741932192527428924222476780414581298828125
    1
    
    原因是后面有一堆 的小数位
    
    BigDecimal b3 = new BigDecimal(0.02);
    System.out.println(b3); // 0.0200000000000000004163336342344337026588618755340576171875
    

    2、0.1 * 0.2 == 0.02
    设置精度后再作计算

    BigDecimal b1 = new BigDecimal(0.1).setScale(2, BigDecimal.ROUND_HALF_DOWN);
    BigDecimal b2 = new BigDecimal(0.2).setScale(2, BigDecimal.ROUND_HALF_DOWN);
    BigDecimal b3 = new BigDecimal(0.02).setScale(2, BigDecimal.ROUND_HALF_DOWN);
    System.out.println(b1.multiply(b2).compareTo(b3) == 0); 
    
    打印结果 
    true
    

    3、BigDecimal的round模式

    BigDecimal.ROUND_UP
    无条件进1,1.01 ->1.1
    BigDecimal.ROUND_DOWN
    无条件舍弃,1.09 -> 1.0
    BigDecimal.ROUND_HALF_UP
    四舍五入
    BigDecimal.ROUND_HALF_DOWN
    五舍六入,即舍弃部分大于等于6才会进1
    BigDecimal.ROUND_CEILING
    向正无穷方向舍弃,1.01  -> 1.1
    BigDecimal.ROUND_FLOOR
    向负无穷方向舍弃,1.09  -> 1.0
    BigDecimal.ROUND_HALF_EVEN
    当舍弃部分的左边是奇数时,表现同ROUND_HALF_UP(四舍五入)  
    当舍弃部分的左边是偶数时,表现同ROUND_HALF_DOWN(五舍六入)
    BigDecimal.ROUND_UNNECESSARY
    Assert操作,证明计算是准确的,不需要round
    System.out.println(new BigDecimal(1.25).setScale(1, BigDecimal.ROUND_HALF_UP).setScale(1, BigDecimal.ROUND_UNNECESSARY));
    

    4、BigDecimal.ROUND_UP和BigDecimal.ROUND_CEILING和区别?

    在正数情况下,表现一致,负数情况下,表现不同
    ROUND_UP   -1.01 -> -1.1
    ROUND_CEILING  -1.01 ->  -1.0
    

    5、为什么BigDecimal.ROUND_HALF_UP和BigDecimal.ROUND_HALF_DOWN没有举例?
    以ROUND_HALF_UP举例:

    BigDecimal b1 = new BigDecimal(1.15).setScale(1, BigDecimal.ROUND_HALF_UP);
    BigDecimal b2 = new BigDecimal(1.25).setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println(b1);
    System.out.println(b2);
    
    打印结果
    1.1
    1.3
    
    这里1.15没有和预想的一样进1,千万不要怀疑系统有问题,打印1.15和1.25的值就明白了
    
    BigDecimal b1 = new BigDecimal(1.15);
    BigDecimal b2 = new BigDecimal(1.25);
    System.out.println(b1);
    System.out.println(b2);
    
    打印结果
    1.149999999999999911182158029987476766109466552734375
    1.25
    0.049999999999999911182158029987476766109466552734375确实小于0.05
    

    2020年1月13日更新
    可以使用字符串参数的构造方法来构造BigDecimal对象

    System.out.println(new BigDecimal("1.15"));
    

    相关文章

      网友评论

          本文标题:BigDecimal compareTo比较大小

          本文链接:https://www.haomeiwen.com/subject/vmtkjctx.html