BigDecimald简单使用

为什么要用BigDecimal运算

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

例1

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

例2

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

BigDecimal使用

BigDecimal实现加法运算

java 复制代码
    @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实现减法运算

java 复制代码
    @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实现乘法运算

java 复制代码
    @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实现除法运算

java 复制代码
    @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求绝对值

java 复制代码
    @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 比较大小

java 复制代码
    @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
    }
相关推荐
wangwangblog3 分钟前
LLVM 数据结构简介
开发语言·数据结构·c++
Yeats_Liao11 分钟前
Java 软件测试(三):Mockito打桩与静态方法模拟解析
java·开发语言
JAVA学习通12 分钟前
RabbitMQ---面试题
java·开发语言
艾菜籽18 分钟前
UDP套接字的使用
java·开发语言·网络
云天徽上28 分钟前
【数据可视化-111】93大阅兵后的军费开支情况———2024年全球军费开支分析:用Python和Pyecharts打造炫酷可视化大屏
开发语言·python·信息可视化·pyecharts
zhangfeng113343 分钟前
错误于make.names(vnames, unique = TRUE): invalid multibyte string 9 使用 R 语言进行数据处理时
开发语言·r语言·生物信息
七夜zippoe1 小时前
缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(三)
java·开发语言·缓存
lllsure1 小时前
【Docker】镜像
java·spring cloud·docker
zhysunny1 小时前
51.不可变基础设施:云原生时代的「乐高城堡」建造法
java·云原生
郝学胜-神的一滴1 小时前
Linux命令行的核心理念与实用指南
linux·运维·服务器·开发语言·程序人生