您的位置:首页 > 移动开发 > Objective-C

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

2020-07-13 05:47 776 查看

对象转换成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研读:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: