为什么要用BigDecimal运算

在计算浮点型数据时,往往会存在数据计算失真问题

例1

2.0 – 1.9应该等于0.1,用float类型赋值运算得出的结果为0.100000024,有问题

例2

1.8 – 1.9应该等于 -0.1,用double类型赋值得出的结果为-0.09999999999999987,明显有问题

BigDecimal使用

BigDecimal实现加法运算

@org.junit.jupiter.api.Testpublic void aaa(){BigDecimal d1 = BigDecimal.valueOf(2.0D);BigDecimal d2 = BigDecimal.valueOf(1.9D);//不设置舍入模式BigDecimal d = d1.add(d2);//3.9//设置舍入模式,公共的模式,可去MathContext类查看更多BigDecimal dd = d1.add(d2, MathContext.DECIMAL32);//3.9//设置舍入模式,以new方式设置舍入模式BigDecimal ddd = d1.add(d2, new MathContext(5)); //3.9}

BigDecimal实现减法运算

@org.junit.jupiter.api.Testpublic void aaa(){BigDecimal d1 = BigDecimal.valueOf(2.0D);BigDecimal d2 = BigDecimal.valueOf(1.9D);BigDecimal d = d1.subtract(d2); //0.1BigDecimal dd = d1.subtract(d2, MathContext.DECIMAL32); //0.1BigDecimal ddd = d1.subtract(d2, new MathContext(5));//0.1}

BigDecimal实现乘法运算

@org.junit.jupiter.api.Testpublic void aaa(){BigDecimal d1 = BigDecimal.valueOf(2.0D);BigDecimal d2 = BigDecimal.valueOf(1.9111111111111111111111111111111111111111D);BigDecimal multiply0 = d1.multiply(d2); //3.82222222222222240BigDecimal multiply1 = d1.multiply(d2, MathContext.UNLIMITED);//3.82222222222222240BigDecimal multiply2 = d1.multiply(d2, MathContext.DECIMAL32);//3.822222BigDecimal multiply3 = d1.multiply(d2, MathContext.DECIMAL64);//3.822222222222222BigDecimal multiply4 = d1.multiply(d2, MathContext.DECIMAL128); //3.82222222222222240BigDecimal multiply5 = d1.multiply(d2, new MathContext(2));//3.8}

BigDecimal实现除法运算

@org.junit.jupiter.api.Testpublic void aaa(){BigDecimal d1 = BigDecimal.valueOf(2.0D);BigDecimal d2 = BigDecimal.valueOf(1.00000000);//不设置舍入方式及小数位数BigDecimal divide0 = d1.divide(d2); //2//以RoundingMode设置舍入方式BigDecimal divide1 = d1.divide(d2, RoundingMode.HALF_UP); //2.0//以MathContext设置舍入方式BigDecimal divide2 = d1.divide(d2,MathContext.UNLIMITED); //2//设置小数位数,舍入方式BigDecimal divide4 = d1.divide(d2,10, RoundingMode.HALF_UP);//2.0000000000}

BigDecimal求绝对值

@org.junit.jupiter.api.Testpublic void aaa(){BigDecimal d1 = BigDecimal.valueOf(-2.0123456789D);BigDecimal abs = d1.abs();//2.0123456789BigDecimal abs1 = d1.abs(MathContext.DECIMAL32);//2.012346}

BigDecimal比较大小

@org.junit.jupiter.api.Testpublic void aaa(){BigDecimal d1 = BigDecimal.valueOf(-2.0123456789D);BigDecimal d3 = BigDecimal.valueOf(-2.0123456789D);BigDecimal d2 = BigDecimal.valueOf(-3.0123456789D);//用compareTo比较两个BigDecimal的大小->0:等于;1:大于;-1:小于int i = d1.compareTo(d2); //1int i2 = d2.compareTo(d1);//-1int i3 = d3.compareTo(d1);//0}