常用BigDecimal比较

  • A+
所属分类:Java

BigDecimal a = new BigDecimal("10.00");  

BigDecimal b = new BigDecimal("10");  

//前提为a、b均不能为null

if(a.compareTo(b) == -1){

    System.out.println("a小于b");

}

 

if(a.compareTo(b) == 0){

    System.out.println("a等于b");

}

 

if(a.compareTo(b) == 1){

    System.out.println("a大于b");

}

 

if(a.compareTo(b) > -1){

    System.out.println("a大于等于b");

}

 

if(a.compareTo(b) < 1){

    System.out.println("a小于等于b");

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

BigDecimal是Java里精确计算的类,下面说一下两个BigDecimal对象大小,相等的判断。

    一般的对象用equals,但是BigDecimal比较特殊,举个例子:

1

Java代码 收藏代码

BigDecimal a=BigDecimal.valueOf(1.0);

BigDecimal b=BigDecimal.valueOf(1.000);

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

    解决办法:if(a.compareTo(b)==0) 结果是true。

1

实例一:

Java代码 收藏代码

import java.math.BigDecimal;  

public class Test {  

  public static void main(String[] args) {  

        

      BigDecimal a = new BigDecimal("10.00");  

      BigDecimal b = new BigDecimal("10");  

      BigDecimal c = new BigDecimal(10.00);  

        

      //equals方式  

      System.out.println(a.equals(b)); //false  

      System.out.println(a.equals(c)); //false  

        

      //toPlainString再equals  

      System.out.println(a.toPlainString().equals(b.toPlainString())); //false  

      System.out.println(a.toPlainString().equals(c.toPlainString())); //false  

        

      //longValue方式  

      System.out.println(a.longValue() == b.longValue()); //true  

      System.out.println(a.longValue() == c.longValue()); //true  

        

      //compareTo  

      System.out.println(a.compareTo(b) == 0); //true  

      System.out.println(a.compareTo(c) == 0); //true  

  }  

}  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

    从实例一来看,好像longValue方式也可以,让我们继续看实例二。

1

实例二:

Java代码 收藏代码

import java.math.BigDecimal;  

public class Test02 {  

  public static void main(String[] args) {  

        

      BigDecimal d = new BigDecimal("10.100001");  

      BigDecimal e = new BigDecimal(10.100001);  

        

      System.out.println(e.equals(d)); //false  

      System.out.println(e.toPlainString().equals(d.toPlainString())); //false  

      System.out.println(e.longValue() == d.longValue()); //true  

      System.out.println(e.compareTo(d) == 0); //false  

  }  

}  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

为什么compareTo方法不可以了,而longValue方式却还是OK的。让我们Debug一下。

    Debug我们发现,BigDecimal d = new BigDecimal("10.100001");和BigDecimal e = new BigDecimal(10.100001);

    出来的两个对象,实际上确实是不一样的,而longValue()后都变成了10。

1

2

BigDecimal如何保留小数位

1 BigDecimal big = new BigDecimal(“2.3513”); //设置BigDecimal初始值

2 big.setScale(1); // 保留1位小数,默认用四舍五入。

3 big.setScale(1, BigDecimal.ROUND_DOWN); // 直接删除多余的小数,2.3513直接被截断位2.3

4 big.setScale(1, BigDecimal.ROUND_HALE_UP); //四舍五入,向上舍入,2.3513变成2.4

5 big.setScale(1, BigDecimal.ROUND_HALF_DOWN); //四舍五入,向下舍入,2.3513变成2.3

方法总结为:

setScale(int x); BigDecimal值后保留x位小数

setScale(x, BigDecimal.ROUND_DOWN); 保留1位小数,默认用四舍五入

setScale(x, BigDecimal.ROUND_HALE_UP); 保留一位小数,向上舍入

setScale(x, BigDecimal.ROUND_HALF_DOWN); 保留一位小数,向下舍入

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: