Java常用API之BigDecimal(Java中实现高精度运算)

概述

BigDecimal是Java中一个用于高精度计算的类。它提供了完整的精确数字运算功能,可以处理需要高精度或大范围数字运算的场景。

与基本数据类型(如int、double)相比,BigDecimal能够提供任意精度的小数点运算,避免了浮点数运算中的精度损失问题。

BigDecimal可以进行加、减、乘、除等基本数学运算,同时也支持取余、取整、比较大小等操作。它还提供了一系列方法来处理特殊需求,比如设置精度、四舍五入等。

使用BigDecimal时,需要通过其构造函数来创建BigDecimal对象,可以传入String、double或BigInteger等数据类型作为参数。BigDecimal对象创建后,可以进行各种精确的数学运算。

应用场景

用于解决浮点型运算时,出现结果失真的问题。

浮点型运算时出现的失真错误案例如下

这个时候0.1 + 0.2 != 0.3 ,显然是错误的。

BigDecimal的使用方法

把double类型变成字符串,封装成BigDecimal对象来运算。

此时我们调用Double类中的Double.toString()方法将双精度浮点a和b转换为字符串表示形式。

当然,我们有一种优化写法

BigDecimal中的valueOf方法可以直接把double类型的数据接收过来转成字符串封装给BigDecimal对象。

valueOf原码:

再然后,调用BigDecimal中的add方法将两个数加起来,封装给一个新的BigDecimal对象

需要注意一点,此时我们输出c1,并没有输出c1的地址,说明BigDecimal也重写了object类中的toString方法,把c1对象里面运算出的结果直接输出了。

同样可以进行减法、乘法和除法运算:

进行除法运算时,我们要考虑一种情况,比如一除以三......

此时,程序报错~

原因就是最终结果是0.33333333333........而BigDecimal必须得到一个精准的结果,所以他就崩溃了

解决方法:我们可以调用另一个divide方法

public BigDecimal divide(另一个BigDecimal对象 , 精确几位 , 舍入模式)

这样输出的结果就是 0.33 了

最后,我们经常使用double来修饰双精度浮点数,所以我们还得把运算结果变成double类型

把BigDecimal对象转换成double类型的数据

注意事项

本文章介绍了正例中的两个办法,没有介绍BigDecimal(double)方法的原因如上

本文中使用的代码

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Test {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
        double c = a + b;
        System.out.println(c);

        System.out.println("-----------------------");

        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);

        BigDecimal c1 = a1.add(b1);
        System.out.println(c1);

        BigDecimal c2 = a1.subtract(b1); //减法
        BigDecimal c3 = a1.multiply(b1); // 乘法
        BigDecimal c4 = a1.divide(b1); // 除法

        System.out.println("减法:" + c2 + " 乘法:" + c3 + " 除法:" + c4);
        System.out.println("--------------------------");

        BigDecimal x = BigDecimal.valueOf(0.1);
        BigDecimal y = BigDecimal.valueOf(0.3);
        BigDecimal k = x.divide(y,2, RoundingMode.HALF_UP); // 除法
        Double db = k.doubleValue();
        System.out.println(db);


    }
}

最后祝大家好好学习,天天向上

(能给我点个赞就更好了)

  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值