JAVA里的BigDecimal用法

cpp 复制代码
public class BigDecimaldemo1 {
    public static void main(String[] args) {
        System.out.println(0.09+0.01);//为什么不是0.10呢?
    }
}

在使用float或者double类型的数据在进行数学运算的时候,很有可能会产生精度丢失问题。我们都知道计算机底层在进行运算的时候,使用的都是二进制数据;

趋近于这个十进数的二进制数据; 这样使用一个不太准确的数据进行运算的时候, 最终就会造成精度丢失;为了提高精度,Java就给我们提供了BigDecimal供我们进行数据运算。

构造方法

1.通过传递double类型的小数来创建对象

cpp 复制代码
//1.通过传递double类型的小数来创建对象
        BigDecimal bd1 = new BigDecimal(0.01);
        BigDecimal bd2 = new BigDecimal(0.09);
        System.out.println(bd1.add(bd2));

2.通过传递字符串表示的小数来创建对象

cpp 复制代码
 //2.通过传递字符串表示的小数来创建对象
        BigDecimal bd3=new BigDecimal("3.14");
        BigDecimal bd4=new BigDecimal("1.11");
        System.out.println(bd3.add(bd4));

3.通过静态方法来获取对象

cpp 复制代码
 BigDecimal bd5=BigDecimal.valueOf(10.0);
        BigDecimal bd6=BigDecimal.valueOf(10.0);
        System.out.println(bd5==bd6);

常见成员方法

public BigDecimal add(BigDecimal value) // 加法运算
public BigDecimal subtract(BigDecimal value) // 减法运算
public BigDecimal multiply(BigDecimal value) // 乘法运算
public BigDecimal divide(BigDecimal value) // 触发运算

cpp 复制代码
public class BigDecimalDemo01 {

    public static void main(String[] args) {

        // 创建两个BigDecimal对象
        BigDecimal b1 = new BigDecimal("0.3") ;
        BigDecimal b2 = new BigDecimal("4") ;

        // 调用方法进行b1和b2的四则运算,并将其运算结果在控制台进行输出
        System.out.println(b1.add(b2));         // 进行加法运算
        System.out.println(b1.subtract(b2));    // 进行减法运算
        System.out.println(b1.multiply(b2));    // 进行乘法运算
        System.out.println(b1.divide(b2));      // 进行除法运算

    }

}

运行程序进行测试,控制台输出结果如下:

4.3

-3.7

1.2

0.075

如果使用BigDecimal类型的数据进行除法运算的时候,得到的结果是一个无限循环小数,那么就会报错:ArithmeticException。 如下代码所示:

cpp 复制代码
public class BigDecimalDemo02 {

    public static void main(String[] args) {

        // 创建两个BigDecimal对象
        BigDecimal b1 = new BigDecimal("1") ;
        BigDecimal b2 = new BigDecimal("3") ;

        // 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出
        System.out.println(b1.divide(b2));

    }

}

运行程序进行测试,控制台输出结果如下所示:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

针对这个问题怎么解决,此时我们就需要使用到BigDecimal类中另外一个divide方法,如下所示:

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

上述divide方法参数说明:

divisor: 除数对应的BigDecimal对象;

scale: 精确的位数;

roundingMode: 取舍模式;

取舍模式被封装到了RoundingMode这个枚举类中(关于枚举我们后期再做重点讲解),在这个枚举类中定义了很多种取舍方式。最常见的取舍方式有如下几个:
UP(直接进1) , FLOOR(直接删除) , HALF_UP(4舍五入),我们可以通过如下格式直接访问这些取舍模式:枚举类名.变量名

cpp 复制代码
public class BigDecimaldemo2 {
    public static void main(String[] args) {
        // 演示取舍模式HALF_UP
        // 创建两个BigDecimal对象
        BigDecimal b1 = new BigDecimal("0.95") ;
        BigDecimal b2 = new BigDecimal("3") ;
        System.out.println(b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP));

    }
}
相关推荐
宸津-代码粉碎机1 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
chenbingjie_c2 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
噢,我明白了3 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅3 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
考虑考虑3 小时前
synchronized字符串常量
java·后端·java ee
长谷深风1113 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383003 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析
Escalating_xu3 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
实心儿儿3 小时前
Qt — Qt 事件
开发语言·qt
周杰偷奶茶4 小时前
【Java】数据类型与变量
java·开发语言