BigDecimald简单使用
2023-12-13 08:41:20
为什么要用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.Test
public 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.Test
public void aaa(){
BigDecimal d1 = BigDecimal.valueOf(2.0D);
BigDecimal d2 = BigDecimal.valueOf(1.9D);
BigDecimal d = d1.subtract(d2); //0.1
BigDecimal dd = d1.subtract(d2, MathContext.DECIMAL32); //0.1
BigDecimal ddd = d1.subtract(d2, new MathContext(5)); //0.1
}
????????BigDecimal实现乘法运算
????????????????
@org.junit.jupiter.api.Test
public void aaa(){
BigDecimal d1 = BigDecimal.valueOf(2.0D);
BigDecimal d2 = BigDecimal.valueOf(1.9111111111111111111111111111111111111111D);
BigDecimal multiply0 = d1.multiply(d2); //3.82222222222222240
BigDecimal multiply1 = d1.multiply(d2, MathContext.UNLIMITED); //3.82222222222222240
BigDecimal multiply2 = d1.multiply(d2, MathContext.DECIMAL32); //3.822222
BigDecimal multiply3 = d1.multiply(d2, MathContext.DECIMAL64); //3.822222222222222
BigDecimal multiply4 = d1.multiply(d2, MathContext.DECIMAL128); //3.82222222222222240
BigDecimal multiply5 = d1.multiply(d2, new MathContext(2)); //3.8
}
????????BigDecimal实现除法运算
????????????????
@org.junit.jupiter.api.Test
public 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.Test
public void aaa(){
BigDecimal d1 = BigDecimal.valueOf(-2.0123456789D);
BigDecimal abs = d1.abs(); //2.0123456789
BigDecimal abs1 = d1.abs(MathContext.DECIMAL32); //2.012346
}
????????BigDecimal?比较大小
????????????????
@org.junit.jupiter.api.Test
public 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); //1
int i2 = d2.compareTo(d1); //-1
int i3 = d3.compareTo(d1); //0
}
文章来源:https://blog.csdn.net/weixin_49990593/article/details/134948359
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!