对象转换成Bigdecimal--然后加减乘除或比较大小
Object(对象)转Bigdecimal
我的项目经常用 Map<String,Object> map = new HashMap<String, Object>(); 接收数据, 那么当我用map.get(“key”)的时候, 获取的 value是 一个对象, 这个对象是BigDecimal类型的, 就需要转换处理; 对象转换成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的大小比较
比较大小的方法我一般用这种, 下面是代码, 有注释;
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 ) {
System. out. println ( "aaaa小于等于 bbbb" ) ;
}
if ( bbbb. compareTo ( new BigDecimal ( 0.60 ) ) >= 0 ) {
System. out. println ( "bbbb大于等于0.60" ) ;
}
}
}
Bigdecimal的加减乘除
Bigdecimal的加减乘除API很多, 下面代码是日常使用的:
BigDecimal aaaa = new BigDecimal ( 0.01 ) ;
BigDecimal bbbb = new BigDecimal ( 0.71 ) ;
BigDecimal add = aaaa. add ( bbbb) ;
double add1 = aaaa. add ( bbbb) . doubleValue ( ) ;
BigDecimal subtract = bbbb. subtract ( aaaa) ;
double subtract1 = bbbb. subtract ( aaaa) . doubleValue ( ) ;
BigDecimal multiply = aaaa. multiply ( bbbb) ;
double multiply1 = aaaa. multiply ( bbbb) . doubleValue ( ) ;
BigDecimal divide = bbbb. divide ( aaaa, 2 ) ;
BigDecimal divide1 = bbbb. divide ( aaaa, 2 , BigDecimal. ROUND_DOWN) ;
BigDecimal divide2 = bbbb. divide ( aaaa, 2 , BigDecimal. ROUND_UP) ;
BigDecimal divide3 = bbbb. divide ( aaaa, 2 , BigDecimal. ROUND_HALF_UP) ;
BigDecimal divide4 = bbbb. divide ( aaaa, 2 , BigDecimal. ROUND_HALF_DOWN) ;
注意
本文上面的示范一般够基本的使用了, 以下是需要注意的: 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);
BigDecimal amount = new BigDecimal ( 0.04 ) ;
BigDecimal thisAmount = new BigDecimal ( 0.02 ) ;
amount. add ( thisAmount ) ;
amount = amount. add ( thisAmount ) ;
BigDecimal a = new BigDecimal ( "1.00" ) ;
BigDecimal b = new BigDecimal ( "1.0" ) ;
System. out. println ( a. equals ( b) ) ;
BigDecimal aa = new BigDecimal ( 10 ) ;
BigDecimal bb = new BigDecimal ( 3 ) ;
a = a. divide ( b) ;
a = a. divide ( b, 2 , BigDecimal. ROUND_HALF_UP) ;
本文是个人工作中遇到的, 特此记录下来, 方便以后查阅; 想要深入了解, 就请各自找API研读: