java.math.BigDecimal

BigDecimal类位于java.math.BigDecimal包下。使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。

对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

2.BigDecimal类常用方法

2.1.BigDecimal(String val):构造方法,将String类型转换成BigDecimal类型数据。

2.2.BigDecimal(double val):构造方法,将double类型转换成BigDecimal类型数据。

2.3.BigDecimal(int val):构造方法,将int类型转换成BigDecimal类型数据。

2.4.BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和。

2.5.BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差。

2.6.BigDecimal multiply(BigDecimal value):乘法,求两个BigDecimal类型数据的积。

2.7.BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商。

2.8.BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数。

2.9.BigDecimal max(BigDecimal value):最大数,求两个BigDecimal类型数据的最大值。

2.10.BigDecimal min(BigDecimal value):最小数,求两个BigDecimal类型数据的最小值。

2.11.BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值。

2.12.BigDecimal negate():相反数,求BigDecimal类型数据的相反数。

代码:

BigDecimal a=new BigDecimal (“4.5”);

BigDecimal b=new BigDecimal (“1.5”);

BigDecimal c=new BigDecimal (“-10.5”);

BigDecimal add_result=a.add(b);

BigDecimal subtract_result=a.subtract(b);

BigDecimal multiply_result=a.multiply(b);

BigDecimal divide_result=a.divide(b);

BigDecimal remainder_result=a.remainder(b);

BigDecimal max_result=a.max(b);

BigDecimal min_result=a.min(b);

BigDecimal abs_result=c.abs();

BigDecimal negate_result=a.negate();

Log.d(“TAG”,”4.5+1.5=”+add_result);

Log.d(“TAG”,”4.5-1.5=”+subtract_result);

Log.d(“TAG”,”4.5*1.5=”+multiply_result);

Log.d(“TAG”,”4.5/1.5=”+divide_result);

Log.d(“TAG”,”4.5/1.5余数=”+remainder_result);

Log.d(“TAG”,”4.5和1.5最大数=”+max_result);

Log.d(“TAG”,”4.5和1.5最小数=”+min_result);

Log.d(“TAG”,”-10.5的绝对值=”+abs_result);

Log.d(“TAG”,”4.5的相反数=”+negate_result);

结果:

4.5+1.5=6.0

4.5-1.5=3.0

4.5*1.5=6.75

4.5/1.5=3

4.5/1.5余数=0.0

4.5和1.5最大数=4.5

4.5和1.5最小数=1.5

-10.5的绝对值=10.5

4.5的相反数=-4.5

这里有一点需要注意的是除法运算divide。

BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。

其实divide有三个参数的方法

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

第一参数表示除数。

第二个参数表示小数点后保留位数。

第三个参数表示舍入模式。只有在作除法运算或四舍五入时才用到舍入模式。

舍入模式有下面这几种:

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 a=new BigDecimal(“4.5”);

BigDecimal b=new BigDecimal(“1.5”);

BigDecimal c=new BigDecimal(“2”);

BigDecimal result1=a.divide(b,2,BigDecimal.ROUND_HALF_UP);

BigDecimal result2=a.divide(c,2,BigDecimal.ROUND_HALF_UP);

Log.d(“TAG”,”4.5/1.5=”+result1);

Log.d(“TAG”,”4.5/2=”+result2);

结果:

4.5/1.5=3.00

4.5/2=2.25

3.BigDecimal 小数点处理

需求:计算结果保留三位小数。

代码:

/**

  • 方式1

  • 0.000:三位小数 同理 0.00:两位小数 依次类推…

  • */

double a=3.154215;

DecimalFormat myformat=new java.text.DecimalFormat(“0.000”);

String result1 = myformat.format(a);

Log.d(“TAG”,a+”保留三位小数:”+result1);

/**

  • 方式2

  • .000:三位小数 同理 #.00:两位小数

  • */

double b=3.256321;

DecimalFormat df=new DecimalFormat(“#.000”);

String result2=df.format(b);

Log.d(“TAG”,b+”保留三位小数:”+result2);

/**

  • BigDecimal类操作保留几位小数

  • */

double c=3.558525;

BigDecimal bigDecimal=new BigDecimal(c);

double result3=bigDecimal.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();

Log.d(“TAG”,c+”保留三位小数并四舍五入:”+result3);

结果:

3.154215保留三位小数:3.154

3.256321保留三位小数:3.256

3.558525保留三位小数并四舍五入:3.559

4.总结:

(1)商业计算使用BigDecimal。

(2)尽量使用参数类型为String的构造函数。

(3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

Original: https://www.cnblogs.com/endv/p/16496347.html
Author: Endv
Title: java.math.BigDecimal

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537695/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 戏说领域驱动设计(十八)——内验

    验证在我们现实的生活中非常常见,比如您找工作得先整个面试验证你的能力是否靠谱;找对象得先验证下对方的颜值和升值空间。有些工程师写代码从不验证,我觉得是有三个原因,一是意识不够,过于…

    Java 2023年6月7日
    078
  • Typora

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年5月29日
    072
  • Springboot 在Filter 中通过@Autowired注入Bean,打包war部署为空值解决

    ServletContext context = request.getServletContext(); ApplicationContext ctx = WebApplicat…

    Java 2023年5月30日
    075
  • 彻底掌握Makefile(三)

    彻底掌握Makefile(三) 前言 在前面的文章彻底掌握Makefile(一)和彻底掌握Makefile(二)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章…

    Java 2023年6月8日
    083
  • 海康NVR设备上传人脸图片到人脸库

    海康开放平台——海康文档链接——海康开发包和文档下载链接 硬件:海康超脑NVR(全称Network Video Recorder,即网络视频录像机)、人脸摄像机。 环境:JDK_1…

    Java 2023年6月5日
    0220
  • Spring 5 源码解析- 事务原理分析-6

    事务配置 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http:/…

    Java 2023年6月6日
    076
  • Windows常用命令手册

    cmd 命令手册 端口命令 查看端口占用详情 netstat -ano 查找过滤命令 findstr (相似Linux中grep) 例如需要查找8080端口占用详情:netstat…

    Java 2023年6月7日
    079
  • II-第十三章:(1)SpringCloud Nacos注册中心和配置中心

    一、Nacos简介 1、命名由来 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。 2、是什么 一个更易于构建云原生应用的动态服务发…

    Java 2023年5月29日
    080
  • Eureka详解系列(三)–探索Eureka强大的配置体系

    通过前面的两篇博客,我们知道了:什么是 Eureka?为什么使用 Eureka?如何使用 Eureka?今天,我们开始来研究 Eureka 的源码,先从配置部分的源码开始看,其他部…

    Java 2023年6月13日
    085
  • SpringBoot:SpringBoot和SpringCloud版本匹配问题导致Bean冲突问题

    报错信息 Error starting ApplicationContext. To display the conditions report re-run your appli…

    Java 2023年5月30日
    089
  • java学习摘抄笔记mybaits1

    mybatis 第一天mybatis 的基础知识 课程安排: mybatis 和springmvc 通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc 程…

    Java 2023年5月29日
    076
  • Oracle数据库备份/导出(exp/expd)、导入(imp/impd)

    ​ 常用的oracle数据库备份(导入/导出)有两种,分别是exp/imp和expd/impd,前者是Orace早期版本带有的导入导出工具,后者是Oracle10g后出现的,下面进…

    Java 2023年6月8日
    091
  • 谈谈线程安全

    谈谈线程安全 线程安全问题是由于多个线程同时执行写操作引起的,例如多个线程同时对一个变量进行+1操作,伪代码如下。 int count = 1; Function A(){ cou…

    Java 2023年6月5日
    072
  • 类的动态装载java

    类的动态装载 首先,我们要明白类加载的过程,再来区分静态加载和动态加载,类加载的过程,本质上就是将类文件,从硬盘读取到内存中的过程,而静态加载是在编译时加载,动态加载是在程序运行时…

    Java 2023年6月5日
    0107
  • Spring Retry 在SpringBoot 中的应用

    Spring Boot中使用Spring-Retry重试框架 Spring Retry提供了自动重新调用失败的操作的功能。这在错误可能是暂时的(例如瞬时网络故障)的情况下很有用。 …

    Java 2023年6月7日
    089
  • 基于OpenResty部署nginx以及nginx+lua开发hello world课程笔记整理

    中华石杉的亿级流量电商详情页系统实战(第二版):缓存架构+高可用服务架构+微服务架构的课程笔记 用到的软件资源我们这里玩儿nginx,全都会在nginx里去写lua脚本,因为我们需…

    Java 2023年5月30日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球