• BigDecimal运算使用方法(附简单案例)


    写在前面BigDecimal的方法已被弃用,用RoundingMode代替

    UP(BigDecimal.ROUND_UP)

    DOWN(BigDecimal.ROUND_DOWN)

    CEILING(BigDecimal.ROUND_CEILING)

    FLOOR(BigDecimal.ROUND_FLOOR)

    HALF_UP(BigDecimal.ROUND_HALF_UP)

    HALF_DOWN(BigDecimal.ROUND_HALF_DOWN)

    HALF_EVEN(BigDecimal.ROUND_HALF_EVEN)

    UNNECESSARY(BigDecimal.ROUND_UNNECESSARY)

    目录

    (一)BigDecimal 加法运算——add()方法

    1、Int 类型

    2、double 类型

    3、String类型

    (二)BigDecimal 减法运算——subtract()方法

    1、Int 类型

    2、double 类型

    3、String类型

    (三)BigDecimal 乘法运算——multiply()方法

    1、Int 类型

    2、double 类型

    3、String类型

    (四)BigDecimal 除法运算——divide()方法

    1、Int 类型

    2、double 类型

    3、String类型

    (五)关于BigDecimal.setScale方法—— 处理小数

    1、BigDecimal.ROUND_UP 进位处理

    2、BigDecimal.ROUND_DOWN直接删除多余的小数位

    3、BigDecimal.ROUND_HALF_UP 四舍五入

    (六)BigDecimal移动小数点的方法

    1、movePointRight、scaleByPowerOfTen 小数点向右移动两位

    2、movePointLeft 小数点向左移动两位

    (七)BigDecimal除法后保留两位小数

    总结


    (一)BigDecimal 加法运算——add()方法

    1、Int 类型

    1. BigDecimal bigInt1 = new BigDecimal(6);
    2. BigDecimal bigInt2 = new BigDecimal(8);
    3. BigDecimal intSum = new BigDecimal(0);
    4. //BigDecimal求和
    5. intSum = bigInt1 .add(bigInt2);
    6. System.out.println("和 :" +intSum);
    7. //打印输出 和 :14

    2、double 类型

    1. BigDecimal bigDouble1 = new BigDecimal(6.6);
    2. BigDecimal bigDouble2 = new BigDecimal(8.8);
    3. BigDecimal doubleSum = new BigDecimal(0);
    4. //BigDecimal求和
    5. doubleSum = bigDouble1.add(bigDouble2);
    6. System.out.println("和:" + doubleSum );
    7. //打印输出 和:15.4000000000000003552713678800500929355621337890625

    输出的结果与我们心中所想是不是不太一样?

    原因: double不能表示为任何有限长度的二进制小数,所以会出现丢失精度问题。

    解决方法: 官方文档中建议使用字符串形式,这样不会丢失精度。

    3、String类型

    1. BigDecimal bigString1 = new BigDecimal("6.6");
    2. BigDecimal bigString2 = new BigDecimal("8.8");
    3. BigDecimal stringSum = new BigDecimal(0);
    4. //BigDecimal求和
    5. stringSum= bigString1.add(bigString2);
    6. System.out.println("和 :" +stringSum);
    7. //打印输出 和 :15.4

    这样就完美的解决了丢失精度的问题。


    (二)BigDecimal 减法运算——subtract()方法

    1、Int 类型

    1. BigDecimal bigInt1 = new BigDecimal(8);
    2. BigDecimal bigInt2= new BigDecimal(6);
    3. BigDecimal intDifference = new BigDecimal(0);
    4. //BigDecimal求差
    5. intDifference = bigInt1.subtract(bigInt2);
    6. System.out.println("差 :" +intDifference);
    7. //打印输出 差:2

    2、double 类型

    1. BigDecimal bigDouble1= new BigDecimal(8.8);
    2. BigDecimal bigDouble2= new BigDecimal(6.6);
    3. BigDecimal douDifference = new BigDecimal(0);
    4. //BigDecimal求差
    5. douDifference = bigDouble1.subtract(bigDouble2);
    6. System.out.println("差 :" +douDifference );
    7. //打印输出 差 :2.2000000000000010658141036401502788066864013671875

    3、String类型

    1. BigDecimal bigString1 = new BigDecimal("8.8");
    2. BigDecimal bigString2= new BigDecimal("6.6");
    3. BigDecimal stringDifference = new BigDecimal(0);
    4. //BigDecimal求差
    5. stringDifference = bigString1.subtract(bigString2);
    6. System.out.println("差 :" +stringDifference );
    7. //打印输出 差 :2.2

    (三)BigDecimal 乘法运算——multiply()方法

    1、Int 类型

    1. BigDecimal bigInt1 = new BigDecimal(8);
    2. BigDecimal bigInt2= new BigDecimal(6);
    3. BigDecimal intProduct = new BigDecimal(0);
    4. //BigDecimal求积
    5. intProduct= bigInt1.multiply(bigInt2);
    6. System.out.println("积 :" +intProduct);
    7. //打印输出 积:48

    2、double 类型

    1. BigDecimal bigDouble1= new BigDecimal(8.8);
    2. BigDecimal bigDouble2= new BigDecimal(6.6);
    3. BigDecimal douProduct = new BigDecimal(0);
    4. //BigDecimal求积
    5. douProduct = bigDouble1.multiply(bigDouble2);
    6. System.out.println("积 :" +douProduct );
    7. //打印输出 积:58.0800000000000015631940186722201564809837179480972682468591095084065045739407651126384735107421875

    3、String类型

    1. BigDecimal bigString1= new BigDecimal("8.8");
    2. BigDecimal bigString2= new BigDecimal("6.6");
    3. //BigDecimal求积
    4. BigDecimal strProduct = new BigDecimal(0);
    5. strProduct = bigString1.multiply(bigString2);
    6. System.out.println("积 :" +strProduct);
    7. //打印输出 积 :58.08
    1. :58.08

    (四)BigDecimal 除法运算——divide()方法

    1、Int 类型

    1. BigDecimal bigInt1= new BigDecimal(24);
    2. BigDecimal bigInt2= new BigDecimal(3);
    3. BigDecimal intConsult = new BigDecimal(0);
    4. //BigDecimal求商
    5. intConsult = bigInt1.divide(bigInt2);
    6. System.out.println("商 :" +intConsult);
    7. //打印输出 商 :8

    2、double 类型

    1. BigDecimal bigDouble1= new BigDecimal(24.6);
    2. BigDecimal bigDouble2= new BigDecimal(2);
    3. BigDecimal douConsult = new BigDecimal(0);
    4. //BigDecimal求商
    5. douConsult = bigDouble1.divide(bigDouble2);
    6. System.out.println("商 :" +douConsult);
    7. //打印输出 商:12.300000000000000710542735760100185871124267578125

    3、String类型

    1. BigDecimal bigString1= new BigDecimal("24.6");
    2. BigDecimal bigString2= new BigDecimal("2");
    3. BigDecimal strConsult = new BigDecimal(0);
    4. //BigDecimal求商
    5. strConsult = bigString1.divide(bigString2);
    6. System.out.println("商:" +strConsult);
    7. //打印输出 商:12.3

    (五)关于BigDecimal.setScale方法—— 处理小数

    1、BigDecimal.ROUND_UP 进位处理

    1. BigDecimal test= new BigDecimal(6.51);
    2. //表示保留一位小数,只要第二位小数不为0都进1
    3. System.out.println(test.setScale(1,BigDecimal.ROUND_UP));
    4. //输出:6.6
    5. BigDecimal test= new BigDecimal(6.50);
    6. //表示保留一位小数,只要第二位小数不为0都进1
    7. System.out.println(test.setScale(1,BigDecimal.ROUND_UP));
    8. //输出:6.5

    2、BigDecimal.ROUND_DOWN直接删除多余的小数位

    1. BigDecimal test= new BigDecimal(6.59);
    2. //直接删除多余的小数位
    3. System.out.println(test.setScale(1,BigDecimal.ROUND_DOWN));
    4. //输出:6.5

    3、BigDecimal.ROUND_HALF_UP 四舍五入

    1. BigDecimal test= new BigDecimal(6.55);
    2. //四舍五入
    3. System.out.println(test.setScale(1,RoundingMode.HALF_UP));
    4. //输出:6.6
    5. //test.setScale(1,BigDecimal.ROUND_HALF_UP)
    6. //BigDecimal.ROUND_HALF_UP已弃用
    1. 6.6

    (六)BigDecimal移动小数点的方法

    1、movePointRight、scaleByPowerOfTen 小数点向右移动两位

    1. BigDecimal test= new BigDecimal("88.666");
    2. System.out.println(test.movePointRight(2));
    3. System.out.println(test.scaleByPowerOfTen(2));
    4. //输出: 8866.6 8866.6

    2、movePointLeft 小数点向左移动两位

    1. BigDecimal test= new BigDecimal("88.666");
    2. System.out.println(test.movePointLeft(2));
    3. //输出:0.88666

    (七)BigDecimal除法后保留两位小数

    1. BigDecimal bigTest1= new BigDecimal("100");
    2. BigDecimal bigTest2= new BigDecimal("68.688");
    3. System.out.println(bigTest2.divide(bigTest1,2,RoundingMode.HALF_UP));
    4. //输出:0.69
    1. 9

    总结

    1、商业计算使用BigDecimal

    2、尽量使用参数类型为String的构造函数
    3、BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值

  • 相关阅读:
    智能科技助力服装业:商品计划管理系统的革命性变革
    瑞吉外卖项目剩余功能补充
    @RequiredArgsConstructor实现构造器注入
    苹果 M1 引入 Linux 的发展历程以及最新进展
    redis学习随笔
    现在的00后,真是卷死了呀,辞职信已经写好了·····
    k8s篇二之、操作命令 与 yml配置文件编写
    转录组研究揭示多途径介导修复的枯草芽孢杆菌亚硒酸盐还原新机制
    FPGA之旅设计99例之第十例-----串口上位机模拟OLED屏
    软件测试个人求职简历该怎么写,模板在这里
  • 原文地址:https://blog.csdn.net/chuxuan0215/article/details/126641751