BigDecimal 基本使用和常用方法

news2024/11/26 12:28:41

背景  

   涉及到比较大的数字之间的计算,使用float、double这样的浮点数就不那么准确了。因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。所以在商业计算中基本要用java.math.BigDecimal

一、初始化使用

    public static void main(String[] args) {
        // 可以使用
        BigDecimal bigDecimal1 = new BigDecimal(10);
        // 推荐使用
        BigDecimal bigDecimal2 = new BigDecimal("10.123");
        // 不推荐 会丢失精确度
        BigDecimal bigDecimal3 = new BigDecimal(10.123);
        System.out.println("输出bigDecimal1:"+bigDecimal1);
        System.out.println("输出bigDecimal2:"+bigDecimal2);
        System.out.println("输出bigDecimal3:"+bigDecimal3);
    }

结果输出:  

 1.2、BigDecimal还提供默认值创建(0、1、10)

  public static void main(String[] args) {
        // 创建默认为0
        BigDecimal bigDecimal1 =  BigDecimal.ZERO;
        // 创建默认为1
        BigDecimal bigDecimal2 = BigDecimal.ONE;
        // 创建默认为10
        BigDecimal bigDecimal3 = BigDecimal.TEN;
        System.out.println("输出bigDecimal1: "+bigDecimal1);
        System.out.println("输出bigDecimal2: "+bigDecimal2);
        System.out.println("输出bigDecimal3: "+bigDecimal3);
    }

结果输出: 

 1.3、int、long、double等,也可以这么创建实例(不推荐)

   public static void main(String[] args) {
        // 创建默认为0
        BigDecimal bigDecimal1 =  BigDecimal.valueOf(10);
        // 创建默认为1
        BigDecimal bigDecimal2 = BigDecimal.valueOf(10L);
        // 创建默认为10
        BigDecimal bigDecimal3 = BigDecimal.valueOf(10.1);
        System.out.println("输出bigDecimal1: "+bigDecimal1);
        System.out.println("输出bigDecimal2: "+bigDecimal2);
        System.out.println("输出bigDecimal3: "+bigDecimal3);
    }

 结果输出: 

 二、使用compareTo方法比较大小

        flag = -1,  表示bigDecimal1小于 bigDecimal2;
        flag = 0,   表示bigDecimal1等于bigDecimal2;
        flag = 1,   表示bigDecimal1大于bigDecimal2;

 实际应用中直接跟0比较就可以了,
    大于0就是bigDecimal1   大于  bigDecimal2
    等于0就是bigDecimal1   等于  bigDecimal2
    小于0就是bigDecimal1   小于  bigDecimal2

public static void main(String[] args) {

        BigDecimal bigDecimal1 = new BigDecimal("10");
        BigDecimal bigDecimal2 = new BigDecimal("20");
        int result = bigDecimal1.compareTo(bigDecimal2);
        System.out.println("bigDecimal1小于 bigDecimal2: " + result);
        if (bigDecimal1.compareTo(bigDecimal2) < 0) {
            System.out.println("实际使用 bigDecimal1小于 bigDecimal2");
        }

        BigDecimal bigDecimal3 = new BigDecimal("10");
        int result1 = bigDecimal1.compareTo(bigDecimal3);
        System.out.println("bigDecimal1等于bigDecimal3: " + result1);
        if (bigDecimal1.compareTo(bigDecimal3) == 0) {
            System.out.println("实际使用 bigDecimal1等于bigDecimal3 ");
        }

        BigDecimal bigDecimal4 = new BigDecimal("5");
        int result2 = bigDecimal1.compareTo(bigDecimal4);
        System.out.println("bigDecimal1大于bigDecimal4: " + result2);
        if (bigDecimal1.compareTo(bigDecimal4) > 0) {
            System.out.println("实际使用 bigDecimal1大于bigDecimal4");
        }
    }

输出结果:

三、BigDecimal设置精度  以及相应八种舍入模式 

ROUND_UP向远离零的方向舍入。舍弃非零部分,并将非零舍弃部分相邻的一位数字加一
ROUND_DOWN

向接近零的方向舍入。舍弃非零部分,同时不会非零舍弃部分相邻的一位数字加一,采取截取行为。

ROUND_CEILING向正无穷的方向舍入。如果为正数,舍入结果同ROUND_UP一致;如果为负数,舍入结果同ROUND_DOWN一致。注意:此模式不会减少数值大小。
ROUND_FLOOR向负无穷的方向舍入。如果为正数,舍入结果同ROUND_DOWN一致;如果为负数,舍入结果同ROUND_UP一致。注意:此模式不会增加数值大小。
ROUND_HALF_UP向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分>= 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。
这种模式也就是我们常说的我们的“四舍五入”。
ROUND_HALF_DOWN向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式。
如果舍弃部分> 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。
这种模式也就是我们常说的我们的“五舍六入”。
ROUND_HALF_EVEN向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则相邻的偶数舍入。
如果舍弃部分左边的数字奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。
四舍六入,被舍位为5时两种情况,如果前一位为奇数,则入位,否则舍去。
ROUND_UNNECESSARY断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
   public static void main(String[] args) {

        BigDecimal bigDecimal1 = new BigDecimal("20.1252122");
        System.out.print("ROUND_UP:-->");
        System.out.println(bigDecimal1.setScale(2,BigDecimal.ROUND_UP));
        System.out.print("ROUND_DOWN:-->");
        System.out.println(bigDecimal1.setScale(2,BigDecimal.ROUND_DOWN));
        System.out.print("ROUND_CEILING:-->");
        System.out.println(bigDecimal1.setScale(2,BigDecimal.ROUND_CEILING));
        System.out.print("ROUND_FLOOR:-->");
        System.out.println(bigDecimal1.setScale(2,BigDecimal.ROUND_FLOOR));
        System.out.print("ROUND_HALF_UP:-->");
        System.out.println(bigDecimal1.setScale(2,BigDecimal.ROUND_HALF_UP));
        System.out.print("ROUND_HALF_DOWN:-->");
        System.out.println(bigDecimal1.setScale(2,BigDecimal.ROUND_HALF_DOWN));
        System.out.print("ROUND_HALF_EVEN:-->");
        System.out.println(bigDecimal1.setScale(2,BigDecimal.ROUND_HALF_EVEN));
        System.out.print("ROUND_UNNECESSARY:-->");
        System.out.println(bigDecimal1.setScale(BigDecimal.ROUND_UNNECESSARY));
    }

结果输出

注意点: 

ROUND_UNNECESSARY断言请求的操作具有精确的结果,因此不需要舍入。

如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

 

四、基本使用(加、减、乘、除)

   public static void main(String[] args) {

        BigDecimal bigDecimal1 = new BigDecimal("20");
        BigDecimal bigDecimal2 = new BigDecimal("10");
        System.out.print("加-->" + bigDecimal1 + "+" + bigDecimal2 + "=");
        System.out.println(bigDecimal1.add(bigDecimal2));

        System.out.print("减-->" + bigDecimal1 + "-" + bigDecimal2 + "=");
        System.out.println(bigDecimal1.subtract(bigDecimal2));

        System.out.print("乘-->" + bigDecimal1 + "*" + bigDecimal2 + "=");
        System.out.println(bigDecimal1.multiply(bigDecimal2));

        System.out.print("除-->" + bigDecimal1 + "/" + bigDecimal2 + "=");
        System.out.println(bigDecimal1.divide(bigDecimal2));

    }

结果输出:

注意点:除法小数点过多会报错 示例:

   public static void main(String[] args) {

        BigDecimal bigDecimal1 = new BigDecimal("20");
        BigDecimal bigDecimal2 = new BigDecimal("10.00212");
        
        System.out.println(bigDecimal1.divide(bigDecimal2));

    }

 结果输出:

 出现当前异常的原因在于 BigDecimal 是不可变的、任意精度的有符号十进制数,所以可以做精确计算。但在除法中,准确的商可能是一个无限长的十进制扩展;例如,1 除以 3 所得的商。我们在做除法时,没有指定舍入模式,并且无法表示为准确的结果,因此抛出了这个异常(java.lang.ArithmeticException)。

 了解问题所在我们只需要在 divide() 方法中传入 MathContext 对象或 RoundingMode 对象,指定精度和舍入模式就可以解决该问题

  public static void main(String[] args) {

        BigDecimal bigDecimal1 = new BigDecimal("20");
        BigDecimal bigDecimal2 = new BigDecimal("10.00212");
        BigDecimal divide = bigDecimal1.divide(bigDecimal2, 2, BigDecimal.ROUND_HALF_DOWN);
        System.out.println(divide);

    }

结果输出:

 五、BigDecimal其他方法

abs()求绝对值,不管正数还是负数,都得到正数
negate()求相反数,正变负,负变正
pow(int n)求乘方,如BigDecimal.valueOf(2).pow(3)的值为8
max(BigDecimal val)两值比较,返回最大值
min(BigDecimal val)两值比较,返回最小值
 public static void main(String[] args) {
        BigDecimal bigDecimal1 = new BigDecimal("-20");
        System.out.println("求绝对值-->" + bigDecimal1.abs()); // 求绝对值
        System.out.println("求相反数-->" + bigDecimal1.negate()); // 求相反数
        System.out.println("求乘方-->" + bigDecimal1.pow(2));//求乘方
        System.out.println("最大值-->" + bigDecimal1.max(new BigDecimal(10)));//两值比较,返回最大值
        System.out.println("最小值-->" + bigDecimal1.min(new BigDecimal(15)));//两值比较,返回最小值

    }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蹭秦霄贤流量,郭德纲凌晨时分转发老秦动态

都知道德云社董事长王慧很忙&#xff0c;每天除了打理公司业务&#xff0c;还要照顾众多徒弟们的衣食住行。王慧作为德云社董事长&#xff0c;她的忙都在情理之中&#xff0c;而郭德纲作为德云社总班主&#xff0c;他的时间就更加弥足珍贵了。 可是谁能想到&#xff0c;就是这样…

VSCode配置C++开发环境:OpenCV

文章目录Linux编译调试配置OpenCVWin10编译调试配置OpenCV参考最近在做深度学习的C部署相关工作&#xff0c;于是写下这篇文档记录环境配置的过程。环境配置是一项非常繁琐的工作&#xff0c;无论从大学做相关作业还是到工作上。做这项工作需要技术的同时&#xff0c;还需要点运…

从0到1完成一个Vue后台管理项目(一、创建项目)

1.创建文件夹 这很简单&#xff0c;自己选一个盘&#xff0c;然后建一个文件夹即可 我选择的是D盘&#xff0c;最后的目录是vue-admin 注意&#xff1a;最后的目录一定要是英文 2.创建项目 初始化 npm init -y 局部安装vue-cli vue-cli的版本一直在更新&#xff0c;所以不推…

品牌舆情总结及品牌修复,品牌舆情监测监控怎么做?

如今互联网大数据时代&#xff0c;信息流通越来越快&#xff0c;影响覆盖面广。品牌一旦出现舆论&#xff0c;很容易引起大范围的热议&#xff0c;对品牌发展造成不利影响&#xff0c;进而影响品牌声誉。接下来TOOM舆情监测小编带您简单了解品牌舆情总结及品牌修复&#xff0c;…

Linux_Study

文章目录1.操作系统概述1.1 操作系统的作用1.2 常见的操作系统2.Linux介绍2.1 诞生2.2 Linux内核3. Linux基础操作3.1 虚拟机快照3.2 Linux 目录结构3.3 命令、命令行3.4 ls命令&#xff08;列表命令&#xff09;3.5 cd/pwd命令&#xff08;目录命令&#xff09;3.6 相对路径、…

OPENCPU学习---开发环境搭建

BC260Y-CN模组移远公司提供了QuecOpen的开发方案&#xff0c;可以通过提供的SDK中相应的接口快速进行应用开发。开发环境的搭建&#xff0c;首先要准备好开发板、SDK包以及下载工具&#xff0c;准备好后进行编译配置即可进行开发。目前移远提供的BC260Y开发SDK版本为&#xff1…

Lambda表达式超详细总结(简单易懂)

文章目录1、什么是Lambda表达式2、为什么使用Lambda表达式3、函数式接口&#xff08;lambda表达式的使用前提&#xff09;4、推导Lambda表达式5、Lambda表达式语法1、什么是Lambda表达式 Lambda表达式&#xff0c;也可称为闭包。其本质属于函数式编程的概念&#xff0c;是Java…

js判断元素是否在可视区域内

基本概念 首先需要搞清楚 clientHeight、scrollTop 的区别&#xff0c;通俗地说&#xff0c;clientHeight 指的是网页可视区域的高度&#xff0c;scrollTop 指的是网页被卷起来的高度&#xff0c;可以参考这篇文章&#xff1a;彻底搞懂clientHeight、offsetHeight、scrollHeig…

SQL -- MySQL 初识

SQL SQL的概述&#xff1a; SQL全称&#xff1a; Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。 SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统System上实现美国国家…

入门远程连接技术

目录 1、ssh实验 要求&#xff1a;a.两台机器&#xff1a;第一台机器作为客户端&#xff0c;第二台机器作为服务器&#xff0c;在第一台使用rhce用户免密登录第二台机器。b.禁止root用户远程登录和设置三个用户sshuser1, sshuser2, sshuser3&#xff0c; 只允许sshuser3登录&…

DOM(二):节点操作、事件高级

节点操作节点层级事件高级事件对象节点概述 节点至少拥有nodeType&#xff08;节点类型&#xff09;、nodeName&#xff08;节点名称&#xff09;、nodeValue&#xff08;节点值&#xff09;这三个基本属性。 元素节点 nodeType为1属性节点 nodeType为2文本节点 nodeType为3 &…

字节前端必会vue面试题集锦

Vue3有了解过吗&#xff1f;能说说跟vue2的区别吗&#xff1f; 1. 哪些变化 从上图中&#xff0c;我们可以概览Vue3的新特性&#xff0c;如下&#xff1a; 速度更快体积减少更易维护更接近原生更易使用 1.1 速度更快 vue3相比vue2 重写了虚拟Dom实现编译模板的优化更高效的…

3、数据库中的约束数据库设计

约束 * 概念&#xff1a; 对表中的数据进行限定&#xff0c;保证数据的正确性、有效性和完整性。 * 分类&#xff1a; 1. 主键约束&#xff1a;primary key 2. 非空约束&#xff1a;not null 3. 唯一约束&#xff1a;unique 4. 外键约束&#xff1a;forei…

3.0里程碑:Topomel Box 现已在微软商店可用

猿友好&#xff01; 今天是个大喜的日子 我的程序 Topomel Box 的第三个版本(3.0)正式上架微软商店。通过微软商店这个统一的分发渠道&#xff0c;Topomel Box 有望与更多国家的用户见面并提供服务。 安装方法很简单&#xff0c;只需要打开微软商店&#xff08;Microsoft Sto…

⚡️【数据结构】二叉树的概念和相关知识总结

&#x1f332;目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2满二叉树 2.3完全二叉树 2.4满二叉树和完全二叉树的区别 2.5二叉树的性质 2.6…

linux日志管理总结,rules详解、轮转详解、实例展示。

概述 ​ 1、日志文件记录系统事件&#xff0c;包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等 ​ 2、通过日志来检查错误发生的原因&#xff0c;或者受到攻击时攻击者留下的痕迹。 1. rsyslog系统日志管理 1.1 处理日志的程序&#…

工控安全-Modbus重放攻击

文章目录Modbus-重放攻击Modbus-仿真环境(ModSim)Modbus-协议采集(ModbusScan)抓取Modbus/TCP流量使用青云工具进行重放攻击Modbus-重放攻击 Modbus-仿真环境(ModSim) 首先开启Modbus仿真环境 ip地址是10.10.100.11 ModSim32&#xff0c;这个软件是模拟Modbus协议的一个仿真…

git push错误->Error: src refspec master does not match any

参考文章问题描述&#xff1a;在执行命令 git push origin master 时报错->Error: src refspec master does not match any问题分析&#xff1a;在网上查找解决方法&#xff0c;大部分人说是暂存区没有文件&#xff0c;未执行git add 导致出错。但是此时已经执行了git add 操…

将石油和天然气推向边缘

无论是来自在线购物交易还是工业环境中的物联网&#xff08;IoT&#xff09;设备&#xff0c;数据都是不断收集的。幸运的是&#xff0c;世界各地的每一个行业都可以利用这一趋势&#xff0c;许多行业都已经这样做了。在石油和天然气行业&#xff0c;持续的数据通信是现在保持完…

JavaScript刷LeetCode-字符串类解题技巧

序章 我们把字符串、数组、正则、排序、递归归为简单算法。接下来系列里&#xff0c;将系列文章里将为大家逐一介绍。 字符串 翻转字符串中的单词 给定一个字符串&#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。示例 1: 输…