JAVA类BigDecimal常用方法法以及注意事项

本文介绍了Java中用于高精度计算的BigDecimal类,强调了它在商业计算中的重要性。内容包括BigDecimal的构造方法,如从double和String创建对象的差异,以及在进行除法运算时设置精度的必要性。此外,还讲解了DecimalFormat类用于格式化数字,并展示了RoundingMode在舍入模式中的应用。特别指出,不当的舍入操作可能导致在分配计算中出现误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、BigDecimal类介绍

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

二、常用方法法以及注意事项

1.构造函数

构造函数应该使用String类型

BigDecimal aDouble = new BigDecimal(1.22);
System.out.println("构造函数使用double: " + aDouble);
BigDecimal aString = new BigDecimal("1.22");
System.out.println("构造函数使用String: " + aString);

打印结果:

构造函数使用double: 1.2199999999999999733546474089962430298328399658203125
构造函数使用String: 1.22

2.除法注意设置精度

//除法必须设置经度否则会有异常
//ArithmeticException:Non-terminating decimal expansion; no exact representable decimal //result
System.out.println(new BigDecimal(2).divide(new BigDecimal(3)));

3.格式化数字

DecimalFormat类

注意:默认的的RoundingMode

        //0与#的区别:0为此位置不足用0补齐 #为此位置不足就空着
        BigDecimal a = new BigDecimal("1.23");
        System.out.println(new DecimalFormat("0.000").format(a));
        System.out.println(new DecimalFormat("#.###").format(a));

        a = new BigDecimal("3.145");
        DecimalFormat df = new DecimalFormat("###.00");
        System.out.println(df.format(a));
        df.setRoundingMode(RoundingMode.HALF_UP);//默认是 RoundingMode.HALF_EVEN("银行家舍入法)
        System.out.println(df.format(a));

打印结果

1.230
1.23
3.14
3.15

4.业务上舍弃导致的在保留精度上少1的错误

我们都知道,在进行舍弃或者进位的时候,我们其实是放弃了属于数字的一部分精度上的数字,很显然,我们如果要是做按照比例分钱或者是平账一类的系统的时候会出现一些短账的错误。比如:将10的优惠平均分配到三个商品,会出现少0.01的情况。

        BigDecimal a = new BigDecimal("10");
        BigDecimal divide = a.divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP);
        System.out.println(divide.multiply(BigDecimal.valueOf(3)));

打印结果:9.99

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值