对象转换成Bigdecimal--然后加减乘除或比较大小

  • Object(对象)转Bigdecimal
  • Bigdecimal的大小比较
  • Bigdecimal的加减乘除
  • 注意


Object(对象)转Bigdecimal

  1. 我的项目经常用 Map<String,Object> map = new HashMap<String, Object>(); 接收数据, 那么当我用map.get(“key”)的时候, 获取的 value是 一个对象, 这个对象是BigDecimal类型的, 就需要转换处理;
  2. 对象转换成Bigdecimal的代码如下, 我把这段代码放到一个工具类, 调用工具类方便我平常的转换;
import java.math.BigDecimal;  
import java.math.BigInteger;  
  

public class MathUtils {  
      
    public static BigDecimal getBigDecimal( Object value ) {  
        BigDecimal ret = null;  
        if( value != null ) {  
            if( value instanceof BigDecimal ) {  
                ret = (BigDecimal) value;  
            } else if( value instanceof String ) {  
                ret = new BigDecimal( (String) value );  
            } else if( value instanceof BigInteger ) {  
                ret = new BigDecimal( (BigInteger) value );  
            } else if( value instanceof Number ) {  
                ret = new BigDecimal( ((Number)value).doubleValue() );  
            } else {  
                throw new ClassCastException("Not possible to coerce ["+value+"] from class "+value.getClass()+" into a BigDecimal.");  
            }  
        }  
        return ret;  
    }  
}

Bigdecimal的大小比较

  1. 比较大小的方法我一般用这种, 下面是代码, 有注释;
import java.math.BigDecimal;

public class test {

        public void test11(){
        BigDecimal aaaa = new BigDecimal(0.00);
        BigDecimal bbbb = new BigDecimal(0.71);
            if (aaaa.compareTo(bbbb) <= 0  ){
                //如果aaaa 小于等于 bbbb就进来
                System.out.println("aaaa小于等于 bbbb");
            }
            if (bbbb.compareTo(new BigDecimal(0.60)) >= 0){
                //如果bbbb大于等于0.60则进来
                System.out.println("bbbb大于等于0.60");
            }
        }
}

Bigdecimal的加减乘除

  1. Bigdecimal的加减乘除API很多, 下面代码是日常使用的:
BigDecimal aaaa = new BigDecimal(0.01);
        BigDecimal bbbb = new BigDecimal(0.71);
   
        BigDecimal add = aaaa.add(bbbb);//加法运算
        //加法运算结果: 0.71999999999999996468103002911220755777321755886077880859375
        double add1 = aaaa.add(bbbb).doubleValue();//加法运算1
        //加法1运算结果: 0.72

        BigDecimal subtract = bbbb.subtract(aaaa);//减法运算
        //减法运算结果: 0.69999999999999996426469639487777385511435568332672119140625
        double subtract1 = bbbb.subtract(aaaa).doubleValue();//减法运算1
        //减法1运算结果: 0.7

        BigDecimal multiply = aaaa.multiply(bbbb);//乘法运算
        //乘法运算结果: 0.0070999999999999997925270722731738641127628455785422783666072004738790968136896708529093302786350250244140625
        double multiply1 = aaaa.multiply(bbbb).doubleValue();//乘法运算1
        //乘法1运算结果: 0.0070999999999999995

        /**
         * 除法运算,第二个参数为精度数,第三个参数为精度类型
         */
        BigDecimal divide = bbbb.divide(aaaa, 2); //除法运算, 保留两位小数, 默认用四舍五入方式
        //除法运算结果: 70.99999999999999496930191966725953092785973001941779,
        // 然而运行结果没有只保留两位

        BigDecimal divide1 = bbbb.divide(aaaa, 2, BigDecimal.ROUND_DOWN); //除法运算1, 向下取整
        //除法1运算结果: 70.99
        BigDecimal divide2 = bbbb.divide(aaaa, 2, BigDecimal.ROUND_UP); //除法运算2,向上取整
        //除法2运算结果: 71.00
        BigDecimal divide3 = bbbb.divide(aaaa, 2, BigDecimal.ROUND_HALF_UP); //除法运算3, 四舍五入
        //除法3运算结果: 71.00
        BigDecimal divide4 = bbbb.divide(aaaa, 2, BigDecimal.ROUND_HALF_DOWN); //除法运算4, 四舍五入,如果是5则向下舍
        //除法4运算结果: 71.00

注意

  1. 本文上面的示范一般够基本的使用了, 以下是需要注意的:
    1.1. BigDecial是immutable的,就像String一样,它的所有操作都会生成一个新的对象:
    1.2. 不要用equals方法来比较BigDecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false;
    1.3. 如果直接使用a.divide(b)除法,有时会报除不尽异常, 解决:
    a = a.divide(b,2,BigDecimal.ROUND_HALF_UP);
// BigDecial是immutable的,就像String一样,它的所有操作都会生成一个新的对象:
        BigDecimal amount = new BigDecimal(0.04);
        BigDecimal thisAmount = new BigDecimal(0.02);
        amount.add( thisAmount );  // 错误
        amount = amount.add( thisAmount ); // 正确


        // 不要用equals方法来比较BigDecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false;
        // 例如:
        BigDecimal a = new BigDecimal("1.00");
        BigDecimal b = new BigDecimal("1.0");
        System.out.println(a.equals(b)); // false

        // 如果直接使用a.divide(b)除法,有时会报除不尽异常,如下:

        BigDecimal aa = new BigDecimal(10);
        BigDecimal bb = new BigDecimal(3);
        a = a.divide(b); // 错误会报如下异常:java.lang.ArithmeticException: Non-terminating
        // decimal expansion; no exact representable decimal result.
        //解决:
        a = a.divide(b,2,BigDecimal.ROUND_HALF_UP);
  1. 本文是个人工作中遇到的, 特此记录下来, 方便以后查阅;
  2. 想要深入了解, 就请各自找API研读: