BigDecimal使用总结

news2024/11/14 5:53:18

BigDecimal
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。

在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。

BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

第一:注意使用BigDecimal时要使用new BigDecimal("10.245755")或BigDecimal.valueOf(10.245755)形式,不能使用new BigDecimal(10.245755),否则会导致精度出现问题

BigDecimal b1 = new BigDecimal(10.245755);
BigDecimal b2 = BigDecimal.valueOf(10.245755);
BigDecimal b3 = new BigDecimal("10.245755");
System.out.println("b1: " + b1);
System.out.println("b2: " + b2);
System.out.println("b3: " + b3);


运行结果为:
b1: 10.2457550000000008338929546880535781383514404296875
b2: 10.245755
b3: 10.245755


备注:一定要注意切记不能使用new BigDecimal(10.245755)这种形式!!!

第二:BigDecimal常用加减乘除运算

BigDecimal b1 = BigDecimal.valueOf(10.245755);
BigDecimal b2 = new BigDecimal("10.24575");

//加减法的精度跟参与运算的两个值里面精度长的那一个精度保持一致
System.out.println("b1 + b2: " + b1.add(b2));
System.out.println("b1 - b2: " + b1.subtract(b2));
//乘法精度等于两个数精度的和
System.out.println("b1 x b2: " + b1.multiply(b2));
//除法,如果结果是无限循环小数,会报异常java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

//对结果做处理,保留特定位数小数
System.out.println("b1 / b2: " + b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP));


//注意,这是错误处理,这样仍然会存在无限循环
System.out.println("b1 / b2: " + b1.divide(b2).setScale(2, BigDecimal.ROUND_HALF_UP));
//此时需要对结果做处理,保留特定位数小数
System.out.println("b1 / b2: " + b1.divide(b2));


运行结果:
b1 + b2: 20.491505
b1 - b2: 0.000005
b1 x b2: 104.97544429125
b1 / b2: 1.00

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

第三、BigDecimal比较大小

BigDecimal b1 = BigDecimal.valueOf(10.245755);
BigDecimal b2 = new BigDecimal("10.245755");
BigDecimal b3 = new BigDecimal("11.245755");
BigDecimal b4 = new BigDecimal("9.245755");

//BigDecimal类型的比较需要用compareTo方法,==返回0,a<b返回-1,a>b返回1
System.out.println("b1 == b2: " + b1.compareTo(b2));
System.out.println("b1 < b3: " + b1.compareTo(b3));
System.out.println("b1 > b4: " + b1.compareTo(b4));


运行结果:
b1 == b2: 0
b1 < b3: -1
b1 > b4: 1

第四:BigDecimal取绝对值,去尾保留,四舍五入保留等运算

BigDecimal b1 = BigDecimal.valueOf(-10.245755);
BigDecimal b2 = new BigDecimal("10.245755");
BigDecimal b3 = new BigDecimal("10.545755");

//b1和b2的绝对值
System.out.println("b1绝对值: " + b1.abs());
System.out.println("b2绝对值: " + b2.abs());

//通过setScale()方法将小数点后的位数截断
//setScale()并将小数点后的位数设置为0,以截断小数点后的位数。ROUND_DOWN是舍位模式之一,它表示直接截断小数点后的位数,不进行四舍五入
System.out.println("b2小数点截断: " + b2.setScale(0, BigDecimal.ROUND_DOWN));
System.out.println("b3小数点截断: " + b3.setScale(0, BigDecimal.ROUND_DOWN));
System.out.println("b2小数点截断: " + b2.setScale(2, BigDecimal.ROUND_DOWN));
System.out.println("b3小数点截断: " + b3.setScale(2, BigDecimal.ROUND_DOWN));

//setScale()并将小数点后的位数设置为0,以截断小数点后的位数。ROUND_UP是舍位模式之一,它表示直接截断小数点后的位数,直接进1
System.out.println("b2小数点截断: " + b2.setScale(0, BigDecimal.ROUND_UP));
System.out.println("b3小数点截断: " + b3.setScale(0, BigDecimal.ROUND_UP));
System.out.println("b2小数点截断: " + b2.setScale(2, BigDecimal.ROUND_UP));
System.out.println("b3小数点截断: " + b3.setScale(2, BigDecimal.ROUND_UP));

//setScale()并将小数点后的位数设置为0,以截断小数点后的位数。ROUND_HALF_UP是舍位模式之一,它表示直接截断小数点后的位数,进行四舍五入
System.out.println("b2小数点截断: " + b2.setScale(0, BigDecimal.ROUND_HALF_UP));
System.out.println("b3小数点截断: " + b3.setScale(0, BigDecimal.ROUND_HALF_UP));
System.out.println("b2小数点截断: " + b2.setScale(2, BigDecimal.ROUND_HALF_UP));
System.out.println("b3小数点截断: " + b3.setScale(2, BigDecimal.ROUND_HALF_UP));

运行结果:
b1绝对值: 10.245755
b2绝对值: 10.245755
b2小数点截断: 10
b3小数点截断: 10
b2小数点截断: 10.24
b3小数点截断: 10.54
b2小数点截断: 11
b3小数点截断: 11
b2小数点截断: 10.25
b3小数点截断: 10.55
b2小数点截断: 10
b3小数点截断: 11
b2小数点截断: 10.25
b3小数点截断: 10.55

 

第五、BigDecimal类型转换

BigDecimal b1 = BigDecimal.valueOf(10.245755);
BigDecimal b2 = BigDecimal.valueOf(10.2457556545158512211222);

//BigDecimal类型转换
System.out.println("b1转int: " + b1.intValue());
System.out.println("b1转double: " + b1.doubleValue());
System.out.println("b1转long: " + b1.longValue());
System.out.println("b1转String: " + b1.toString());
System.out.println("b1转String: " + b1.toPlainString());
System.out.println("b1转String: " + b1.toEngineeringString());

System.out.println("====================================");
System.out.println("b2转int: " + b2.intValue());
System.out.println("b2转double: " + b2.doubleValue());
System.out.println("b2转long: " + b2.longValue());
System.out.println("b2转String: " + b2.toString());
System.out.println("b1转String: " + b2.toPlainString());
System.out.println("b1转String: " + b2.toEngineeringString());


运行结果:
b1转int: 10
b1转double: 10.245755
b1转long: 10
b1转String: 10.245755
b1转String: 10.245755
b1转String: 10.245755
====================================
b2转int: 10
b2转double: 10.24575565451585
b2转long: 10
b2转String: 10.24575565451585
b1转String: 10.24575565451585
b1转String: 10.24575565451585

补充案列如下:

注意,一般商业项目当中,BigDecimal用来做金额计算时,需要使用toPlainString()方法将BigDecimal转为String,这种方式不使用科学计数法,显示才是正常的数值

//案例一
         BigDecimal b1 = new BigDecimal("0.000000123").setScale(9);
     System.out.println(b1.toString());
      
     System.out.println(b1.scale());
     System.out.println(b1.unscaledValue());
	//输出结果为
     1.23E-7
     0.000000123
     9
     123

	//案例二
     BigDecimal b2 = new BigDecimal("0.000001234").setScale(9);
     System.out.println(b2.toString());
     System.out.println(b2.toPlainString());
     System.out.println(b2.scale());
     System.out.println(b2.unscaledValue());
	//输出结果为
     0.000001234
     0.000001234
     9
     1234

	//案例三
     BigDecimal b3 = new BigDecimal("0.123000000").setScale(9);
     System.out.println(b3.toString());
     System.out.println(b3.toPlainString());
     System.out.println(b3.scale());
     System.out.println(b3.unscaledValue());
	//输出结果为
     0.123000000
     0.123000000
     9
     123000000

	 //案例四
     BigDecimal b4 = new BigDecimal("123000000");
     System.out.println(b4.toString());
     System.out.println(b4.toPlainString());
     System.out.println(b4.scale());
     System.out.println(b4.unscaledValue());
	//输出结果为
     123000000
     123000000
     0
     123000000

	//案例五
	//Double d = 12345678d; Double d = 12345678.0; 效果一样
     Double d = (double) 12345678;
     BigDecimal b5 = BigDecimal.valueOf(d);
     System.out.println(d);
     System.out.println(b5.toString());
     System.out.println(b5.toPlainString());
     System.out.println(b5.scale());
     System.out.println(b5.unscaledValue());
	//输出结果为
     1.2345678E7
     12345678
     12345678
     0
     12345678

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

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

相关文章

docker案例复现

$uri导致的CRLF注入漏洞 前期准备dockerdocker compose 漏洞配置 前期准备 docker 要完成这样的测试&#xff0c;需要我们有一定的环境&#xff0c;也就是需要大家去安装docker 更新系统软件包&#xff1a; sudo yum update 安装 Docker 的依赖软件包&#xff1a; sudo yum …

WEB集群——LVS-DR 群集、nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 2、配置nginx负载均衡。 一、 LVS-DR 群集 1、LVS-DR工作原理 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09; 名称缩写说明 虚拟IP地址(Virtual IP Address) VIPDirector用于向客户端计算机提供服务的IP地址真实…

TSINGSEE青犀视频安防监控视频平台EasyCVR设备在线,视频无法播放的原因排查

可支持国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等多种协议接入的安防监控视频平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、…

R语言4_安装BayesSpace

环境Ubuntu22/20, R4.1 你可能会报错说你的R语言版本没有这个库&#xff0c;但其实不然。这是一个在Bioconductor上的库。 同时我也碰到了这个问题&#xff0c;ERROR: configuration failed for package systemfonts’等诸多类似问题&#xff0c;下面的方法可以一并解决。 第…

docker小白第二天

centos上安装docker docker官网&#xff0c;docker官网&#xff0c;找到下图中的doc文档。 进入如下页面 选中manuals&#xff0c;安装docker引擎。 最终centos下的docker安装文档链接&#xff1a;安装文档链接. 具体安装步骤&#xff1a; 1、打开Centos&#xff0c;输入命…

设计模式之Bridge模式的C++实现

目录 1、Bridge模式的提出 2、Bridge模式的定义 3、Bridge模式总结 4、需求描述 5、多继承方式实现 6、使用Bridge设计模式实现 1、Bridge模式的提出 在软件功能模块设计中&#xff0c;如果类的实现功能划分不清晰&#xff0c;使得继承得到的子类往往是随着需求的变化&am…

Spring(11) Bean的生命周期

目录 一、简介二、Bean的流程1.BeanDefinition2.Bean 的生命周期 三、代码验证1.User 实体类2.MyBeanPostProcessor 后置处理器3.SpringConfig 扫描包配置4.UserTest 测试类5.测试结果6.模拟AOP增强 三、总结 一、简介 首先&#xff0c;为什么要学习 Spring 中 Bean 的生命周期…

数据请求与导入mysql数据库

端口数据获取与文件保存 文件存入数据库 系统&#xff1a;Ubuntu 工具&#xff1a;Postman&#xff0c;MySql Workbench 端口数据获取与文件保存 打开postman接口测试工具 选择请求方式输入请求地址选择请求参数设置请求参数的格式输入请求参数发送请求 请求成功 选择浏览…

修改IDEA的idea.vmoptions参数导致IDEA无法打开(ReservedCodeCacheSize)

事发原因 Maven导依赖的时候OOM&#xff0c;因此怀疑是内存太小&#xff0c;尝试修改idea.vmoptions的参数&#xff0c;然后发现IDEA重启后打不开了&#xff0c;卸载重装后也无法打开。。。 实际上如果导包爆出OOM的话应该调整下图参数&#xff0c;不过这都是后话了 解决思路…

制作UEFI启动盘

1.制作UEFI BIOS下的启动盘 设置好环境变量。 通过编译ShellPkg得到启动文件&#xff1a; C:\UEFIWorkspace>build -a IA32 -a X64 -p edk2\ShellPkg\ShellPkg.dsc -t VS2017 -b RELEASE 生成的执行文件路径&#xff1a; C:\UEFIWorkspace\Build\Shell\RELEASE_VS2017\…

CANoe通过Frame Histogram窗口统计报文周期(方便快捷)

文章目录 效果展示1.插入Frame Histogram窗口2.Activate3.运行CANoe&#xff0c;停止后查看write窗口 效果展示 统计报文周期信息输出在write窗口。 1.插入Frame Histogram窗口 2.Activate 3.运行CANoe&#xff0c;停止后查看write窗口 统计报文周期信息输出在write窗口。

爬虫学习记录(持续更新)

一、问题记录 1.使用webdriver报错AttributeError: str object has no attribute capabilities 解决&#xff1a;目前使用的selenium版本是4.11.2&#xff0c;可以不必设置driver.exe的路径&#xff0c;selenium可以自己处理浏览器和驱动程序&#xff0c;因此&#xff0c;使用…

SSRF(服务器端请求伪造)漏洞

CSRF漏洞与SSRF漏洞的主要区别在于伪造目标的不同。 一、SSRF是什么 SSRF漏洞&#xff1a;&#xff08;Server-Side Request Forgery&#xff0c;服务器端请求伪造&#xff09;是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从…

【MySQL】范式 (十五)

&#x1f697;MySQL学习第十五站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ ⭐学习汇总贴&#xff0c;超详细思维导图&#xff1a;【MySQL】学习汇总(完整思维导图) 一.引入 在关系型数据库中&#xf…

浅谈AI浪潮下的视频大数据发展趋势与应用

视频大数据的发展趋势是多样化和个性化的。随着科技的不断进步&#xff0c;人们对于视频内容的需求也在不断变化。从传统的电视节目到现在的短视频、直播、VR等多种形式&#xff0c;视频内容已经不再是单一的娱乐方式&#xff0c;更是涉及到教育、医疗、商业等各个领域。 为了满…

一、初识 Spring MVC

文章目录 一、初始 Spring MVC1.1 回顾 MVC 模式1.2 回顾 Servlet 一、初始 Spring MVC 什么是 Spring MVC Spring MVC就是一个 Spring 内置的 MVC 框架。 MVC框架&#xff0c;它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化等等)&#xff0c;而且使用…

Stable Diffusion - 俯视 (from below) 拍摄的人物图像 LoRA 与配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132192139 图像来自 哥特风格 LoRA 俯视 LoRA&#xff0c;提升视觉冲击力&#xff0c;核心配置 <lora:view_from_below:0.6>,(from below,…

Linux6.36 Kubernetes Pod进阶

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes Pod进阶一、资源限制1.CPU 资源单位2.内存 资源单位3.重启策略&#xff08;restartPolicy&#xff09;4.健康检查&#xff1a;又称为探针&#xff08;Probe&#xff09;5.启动、退出动作 计算机系统 5G云计算 第三章 LIN…

WMS系列:层级树的surface 的创建

WMS 创建的surface 与 surfaceflinger 创建的Layer 是一一对应的&#xff0c;只不过可能是创建不同的 Layer 1. DefaultTaskDisplayArea 对应的surface 的创建 DefaultTaskDisplayArea 的调用栈如下&#xff0c;是在系统进程启动服务的时候&#xff0c;去创建对应的SurfaceCont…

研发提测前测试到底能做些什么

目录 需求分析 研发设计分析 测试用例编写 接口文档测试 内部业务逻辑 数据库测试 jimdb测试 异常流程测试 总结 作为测试&#xff0c;经常会遇到倒排期的项目&#xff0c;当研发已经占用了很多资源的情况下&#xff0c;此时测试要想提高效率。就不得不在研发提测前多做…