BigDecimal类

本文详细介绍了Java中的BigDecimal类,用于进行高精度数值运算。BigDecimal不适用于非精确计算,如double类型会存在精度损失。推荐使用BigDecimal(String)构造器避免精度问题。文章还探讨了除法操作,包括divide方法的不同舍入模式,如ROUND_DOWN、ROUND_UP和ROUND_HALF_UP等。
摘要由CSDN通过智能技术生成


推荐导航

0.系统学习导航传送


一.BigDecimal概述

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。

一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。

BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

二.常用的初始化构造

  • BigDecimal(int)创建一个具有参数所指定整数值的对象
  • BigDecimal(double) 创建一个具有参数所指定双精度值的对象
  • BigDecimal(long) 创建一个具有参数所指定长整数值的对象
  • BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象

三.使用易出错点

  • 场景
    public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal(0.1);
        System.out.println(bigDecimal);
        BigDecimal bigDecimal2 = new BigDecimal(0.1);
        System.out.println(bigDecimal2);
    }
//结果
/**
0.1000000000000000055511151231257827021181583404541015625
0.1
*/
  • 原因
    • 参数类型为double的构造方法的结果有一定的不可预知性,这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)
    • 建议使用 BigDecimal(String)构造器,能够准确表达0.1
    • 先使用Double.toString(double) 将dubbo转换成string在使用 BigDecimal(String)构造器

四.常用方法

除法

divide

第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式。
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)
BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2
BigDecimal.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3
BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4
BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35保留1位,变成2.3
后边两种的区别就是如果保留的位数的后一位如果正好是5的时候,一个舍弃掉,一个进位。

BigDecimal.ROUND_FLOOR
朝负无穷方向round 如果为正数,行为和round_down一样,如果为负数,行为和round_up一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值