关于Java中的BigDecimal

为什么用BigDecimal

  • 使用float、double及其对应的包装类时,运算精度可能不满足需求
    • float最多只有7位有效数,则其精度为6-7位。
    • double最多只有16位有效数,则其精度为15~16位。
  • 使用float、double及其对应的包装类时,不便于对小数点以后的若干位进行截取四舍五入或相关处理
    所以BigDecimal主要是用来解决误差问题(精度问题)

BigDecimal构造方法

在这里插入图片描述

通过静态方法创建BigDecimal对象

返回值类型 方法 说明
BigDecimal valueOf(double val) 基于float / double类型的数据创建BigDecimal对象
BigDecimal valueOf(long val) 基于byte/ short / int / long类型的数据创建BiqDecimal对象

BigDecimal常用API

返回值类型 方法 说明
BigDecimal add(BigDecimal augend) 加法运算
BigDecimal subtract(BigDecimal subtrahend) 减法运算
BigDecimal multiply(BigDecimal multiplicand) 乘法运算
BigDecimal divide(BigDecimal divisor) 除法运算
BigDecimal divide(BigDecimal divisor, int roundingMode) 除法运算
BigDecimal divide(BiaDecimaldivisor,int scale, int roundinaMode) 除法运算
BigDecimal remainder(BigDecimal divisor) 求余运算
BigDecimal[] divideAndRemainder(BigDecimal divisor) 除并求余运算
BigDecimal min(BigDecimal val) 取最大值运算
BigDecimal max(BiqDecimal val) 取最小值运算

解释:

  • 在调用divide()方法时,使用roundingMode可以设置运算时的舍入模式
  • 使用BigDecimal类中以ROUND为前缀的常量表示
    • 例如: BigDecimal.ROUND_HALF_UP

关于除法运算的roundingMode

常量值 说明
ROUND_UP 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)
ROUND_DOWN 在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)
ROUND_CEILING 正数时,与ROUND_UP相同,负数时,与ROUND_DOWN相同
ROUND_FLOOR 正数时,与ROUND_DOWN相同,负数时,与ROUND_UP相同
ROUND_HALF_UP 满足四舍五入时,与ROUND_UP相同,否则,与ROUND_DOWN相同
ROUND_HALF_DOWN 满足五舍六入时,与ROUND_UP相同,否则,与ROUND_DOWN相同
ROUND_HALF_EVEN 若舍弃部分左侧为奇数,与ROUND_HALE_UP相同,否则,与ROUND_HALE_DOWN相同
ROUND_UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入

将BigDecimal转换为基本类型

返回值类型 方法 说明
int intValue() 转换为int,可能丢失精度
int intValueExact() 转换为int,若丢失精度则抛出ArithmeticException
long longValue() 转换为long,可能丢失精度
long longValueExact() 转换为long,若丢失精度则抛出ArithmeticException
float floatValue() 转换为float,可能丢失精度
double doubleValue() 转换为double,可能丢失精度
byte byteValueExtra() 转换为byte,若丢失精度则抛出ArithmeticException
short shortValueExact () 转换为short,若丢失精度则抛出ArithmeticException

注意:在进行转换之前,应该明确是否会丢失精度,避免转换结果不符合预期!

代码展示

public class BigDecimalDemo {
    
    
    public static void main(String[] args) {
    
    
        //创建2个基本类型的浮点数
        double d1 = 0.1;
        double d2 = 0.2;
        //计算2个double的和
        System.out.println("两个double求和:");
        System.out.println(d1+d2);//可以发现最后面有误差
        System.out.println();

        //创建BigDecimal
         /**
         * 当原数使用String表示时,使用构造方法创建BIgDecimal对象
         * 当原数使用double表示时,使用静态ValueOf()方法创建BigDecimal对象
         * 当原始使用double表示时,不要使用double作为构造方法来创建BigDecimal
         */
        String s1 = "0.1";
        String s2 = "0.2";
        BigDecimal number1 = new BigDecimal(s1);
        BigDecimal number2 = new BigDecimal(s2);
        //或者
//        BigDecimal number1 = BigDecimal.valueOf(d1);
//        BigDecimal number2 = BigDecimal.valueOf(d2);

        //通过BigDecimal求和
        System.out.println("两个BigDecimal求和:");
        System.out.println(number1.add(number2));
    }
}

小结

  • 使用BigDecimal主要解决基本数据类型运算精度不足的问题
  • 当原数使用String表示时,使用构造方法创建BigDecimal对象;
  • 当原数使用double表示时,使用valueOf()静态方法创建BigDecimal对象;
  • 当需要进行算术运算时,必须使用BigDecimal提供的API;
  • BigDecimal的API几乎包括了你所能想到的所有数值操作:
  • 你可以将Bignteger转换成任何基本数据类型,但可能丢失精度。
    • 在转换之前,应先明确是否可能丢失精度
    • 你不一定需要将结果转换为数值型,使用字符串也可以用于显示或存储

在这里插入图片描述

其他文章

关于java中的BigInteger

猜你喜欢

转载自blog.csdn.net/mfysss/article/details/128844646