java学习:BigDecimal的使用

jupiter
2021-10-31 / 0 评论 / 725 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年12月07日,已超过1080天没有更新,若内容或图片失效,请留言反馈。

1、简介

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

2、基本使用

2.0 头文件导入

import java.math.BigDecimal;

2.1 Bigdecimal的初始化

  • 构造器描述
BigDecimal(int)       //创建一个具有参数所指定整数值的对象。 
BigDecimal(double) //创建一个具有参数所指定双精度值的对象。 //不推荐使用
BigDecimal(long)    //创建一个具有参数所指定长整数值的对象。 
BigDecimal(String) //创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用
  • 示例
BigDecimal num3 = new BigDecimal(100);
BigDecimal num2 = new BigDecimal(10L);
BigDecimal num1 = new BigDecimal(0.005);//不推荐BigDecimal(double)

//尽量用字符串的形式初始化
BigDecimal num12 = new BigDecimal("0.005");
BigDecimal num22 = new BigDecimal("10000");
BigDecimal num32 = new BigDecimal("-1000");
  • 为什么BigDecimal(double)不推荐使用+在商业计算中要用java.math.BigDecimal

    • 示例代码
import java.math.BigDecimal;

public class Solution {
    public static void main(String[] args){
        BigDecimal doubleStr = new BigDecimal(1.11111111);
        System.out.println(doubleStr);
    }
}
  • 运行结果
C:\Users\itrb\Desktop\java>javac Solution.java

C:\Users\itrb\Desktop\java>java Solution
1.111111109999999957409499984350986778736114501953125
  • 分析

    • 根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值
    • 但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算都必须十分精确,你想想,如果你的支付宝账户余额显示193.99999999999998,那是一种怎么样的体验?
    • 这也是在商业计算中要用java.math.BigDecimal的原因

2.2 BigDecimal转回基本类型

  • API
toString()                //将BigDecimal对象的数值转换成字符串。 
doubleValue()          //将BigDecimal对象中的值以双精度数返回。 
floatValue()             //将BigDecimal对象中的值以单精度数返回。 
longValue()             //将BigDecimal对象中的值以长整数返回。 
intValue()               //将BigDecimal对象中的值以整数返回。

2.3 Bigdecimal的基本运算

  • API
add(BigDecimal)        //BigDecimal对象中的值相加,然后返回这个对象。 
subtract(BigDecimal) //BigDecimal对象中的值相减,然后返回这个对象。 
multiply(BigDecimal)  //BigDecimal对象中的值相乘,然后返回这个对象。 
divide(BigDecimal)     //BigDecimal对象中的值相除,然后返回这个对象。 
  • 示例
//加法
BigDecimal result1 = num1.add(num2);
BigDecimal result12 = num12.add(num22);

//减法
BigDecimal result2 = num1.subtract(num2);
BigDecimal result22 = num12.subtract(num22);

//乘法
BigDecimal result3 = num1.multiply(num2);
BigDecimal result32 = num12.multiply(num22);

//绝对值
BigDecimal result4 = num3.abs();
BigDecimal result42 = num32.abs();

//除法
BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);
  • 备注

    • 如果进行除法运算的时候,结果不能整除,有余数,这个时候会报java.lang.ArithmeticException:
    • 这边要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数

      • divide(BigDecimal,保留小数点后几位小数,舍入模式)
    • 舍入模式
ROUND_CEILING    //向正无穷方向舍入
ROUND_DOWN    //向零方向舍入
ROUND_FLOOR    //向负无穷方向舍入
ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式
ROUND_UP    //向远离0的方向舍入
  • 需要对BigDecimal进行截断和四舍五入可用setScale方法
import java.math.BigDecimal;

public class Solution {
    public static void main(String[] args){
        BigDecimal a = new BigDecimal("2.3366");
        a = a.setScale(2,BigDecimal.ROUND_HALF_UP); //保留2位有效数字,且四舍五入
        System.out.println(a);
    }
}
C:\Users\itrb\Desktop\java
λ javac Solution.java

C:\Users\itrb\Desktop\java
λ java Solution
2.34

2.3 BigDecimal 比较大小

BigDecimal a = new BigDecimal (101);
BigDecimal b = new BigDecimal (111);
 
//使用compareTo方法比较
//注意:a、b均不能为null,否则会报空指针
if(a.compareTo(b) == -1){
    System.out.println("a小于b");
}
 
if(a.compareTo(b) == 0){
    System.out.println("a等于b");
}
 
if(a.compareTo(b) == 1){
    System.out.println("a大于b");
}
 
if(a.compareTo(b) > -1){
    System.out.println("a大于等于b");
}
 
if(a.compareTo(b) < 1){
    System.out.println("a小于等于b");
}

参考资料

  1. java 中 BigDecimal 详解
  2. BigDecimal 比较大小
  3. BigDecimal加减乘除计算
0

评论 (0)

打卡
取消