对象转换成Bigdecimal--然后加减乘除或比较大小
- Object(对象)转Bigdecimal
- Bigdecimal的大小比较
- 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 ){
//如果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的加减乘除
- 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. 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);
- 本文是个人工作中遇到的, 特此记录下来, 方便以后查阅;
- 想要深入了解, 就请各自找API研读: