java中BigDecimal的介绍及使用(二)
系列文章目录
- java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题
- java中BigDecimal的介绍及使用(二)
文章目录
- 系列文章目录
- 一、前言
- 二、BigDecimal提供的方法
- 2.1、stripTrailingZeros() 去除小数尾部所有的0
- 2.2、int signum()
- 2.3、int scale()
- 2.4、intValue()
- 2.5、intValueExact()
- 2.6、unscaledValue()
- 2.7、remainder(BigDecimal divisor)
- 2.8、divideAndRemainder(BigDecimal divisor)
- 三、进阶
- 3.1、获取BigDecimal整数部分、小数部分、整数位数、小数位数
一、前言
在上一篇文章 《java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题 》 中主要介绍了BigDecimal的加减乘除运算及格式化方面的使用,本篇主要介绍其他相关的内容。
二、BigDecimal提供的方法
加减乘除等常用的方法在上一篇中已经提过,本篇不再重复写,主要讲一下其他可能用到的方法
| 方法 | 含义 |
|---|---|
| BigDecimal stripTrailingZeros() | 去除小数尾部所有的0,并返回一个BigDecimal类型的数据,不能保证不是科学计数法 |
| int signum() | 返回BigDecimal的正负号, 1:正数 0:零 -1:负数 |
| int scale() | 该方法返回此BigDecimal的小数位数。对于零或正值,小数位数是小数点右边的位数。对于负值,数字的未标度值乘以十,即标度取反的幂。 |
| int intValue() | 返回int数值,小数点后面的数值直接省略 |
| int intValueExact() | 返回int数值,小数点后面的数值直接省略,若BigDecimal对象的值超出int类型取值范围,抛出异常 |
| BigInteger toBigInteger() | 返回BigInteger数值,BigInteger理论上是负无穷到正无穷之间 |
| BigInteger unscaledValue() | 此方法返回一个BigInteger,其值是此BigDecimal值的未缩放值。 |
| divide(BigDecimal) | BigDecimal对象中的值相除,返回BigDecimal对象。该方法可能会遇到无限精度问题,会抛出异常,使用时需注意。详细见上一篇文章的无限精度的坑 |
| BigDecimal remainder(BigDecimal divisor) | 返回当前BigDecimal对象除以divisor后的余数。 被除数divisor不能是0否则抛出异常 |
| BigDecimal[] divideAndRemainder(BigDecimal divisor) | 返回当前BigDecimal对象除以divisor后的商和余数,以数组形式返回。被除数divisor不能是0否则抛出异常 |
int、BigInteger、long取值范围
| 类型 | 取值范围 |
|---|---|
| int | -2,147,483,648 到 2,147,483,647 |
| long | -9223372036854775808~9223372036854775807 |
BigInteger 任意大的整数,其取值范围在负无穷到正无穷之间,原则上是,只要你的计算机的内存足够大,可以有无限位的, 当数值超过long之后就要用BigInteger进行处理了
2.1、stripTrailingZeros() 去除小数尾部所有的0
BigDecimal stripTrailingZeros()
去除小数尾部所有的0,并返回一个BigDecimal类型的数据,不能保证不是科学计数法
0.20—>0.2
10.00—>10
100—>100
public static void main(String[] args) {BigDecimal a= new BigDecimal("10.000");BigDecimal b = new BigDecimal("100000");BigDecimal c = new BigDecimal("10.10");System.out.println(a.stripTrailingZeros().toPlainString());//10System.out.println(b); //100000System.out.println(b.stripTrailingZeros()); //1E+5 注意:返回的值可能已经是个科学计数法了System.out.println(c.stripTrailingZeros().toPlainString());//10.1
}
当stripTrailingZeros()返回科学计数法时,可以通过toPlainString()方法,不使用科学计数法进行输出。
2.2、int signum()
int signum() 返回BigDecimal的正负号,
1:正数 0:零 -1:负数用于判断BigDecimal对象是正数,负数,还是零
public static void main(String[] args) {BigDecimal a= new BigDecimal("10");BigDecimal b = new BigDecimal("-5");BigDecimal c = new BigDecimal("0");System.out.println(a.signum());//1System.out.println(b.signum());//-1System.out.println(c.signum());//0
}
2.3、int scale()
int scale() 该方法返回此BigDecimal的小数位数。
- 对于零或正值,小数位数是小数点右边的位数。
- 对于负值,数字的未标度值乘以十,即标度取反的幂。 注意:当BigDecimal的对象为科学计数法时,scale的值不一定等于小数位数
public static void main(String[] args) {BigDecimal a= new BigDecimal("10.00");BigDecimal b = new BigDecimal("-5.1");BigDecimal c = new BigDecimal("-174");BigDecimal d = new BigDecimal("-1234500");System.out.println(a.scale());//2System.out.println(b.scale());//1System.out.println(c.scale());//0System.out.println(d+"====="+d.scale());//-1234500=====0System.out.println(d.stripTrailingZeros()+"====="+d.stripTrailingZeros().scale());//-1.2345E+6===== -2 注意:当BigDecimal的对象为科学计数法时,scale的值不一定等于小数位数
}
2.4、intValue()
int intValue() 返回int数值,小数点后面的数值直接省略
注意
- int类型的取值范围是-2,147,483,648 到 2,147,483,647所以当超过这个数值时会从负值开始继续转换
- 可以使用intValueExact()方法,当超出int取值范围后会抛异常
public static void main(String[] args) {BigDecimal a= new BigDecimal("2999999999.99");BigDecimal b = new BigDecimal("2147483649");System.out.println(a.intValue());//-1294967297System.out.println(b.intValue());//-2147483647
}
2.5、intValueExact()
int intValueExact() 返回int数值,小数点后面的数值直接省略,若BigDecimal对象的值超出int类型取值范围,抛出异常
int取值范围是-2,147,483,648 到 2,147,483,647,当超过这个范围时抛出异常
以下示例可以看出intValue() 与intValueExact() 的区别
public static void main(String[] args) {BigDecimal a= new BigDecimal("2147483648");BigDecimal b = new BigDecimal("2147483648");System.out.println(a.intValue());//-2147483648System.out.println(b.intValueExact());//抛异常
}
执行结果:
-2147483648
Exception in thread "main" java.lang.ArithmeticException: Overflowat java.math.BigDecimal.intValueExact(BigDecimal.java:3152)at com.ruoyi.common.utils.money.Test1.main(Test1.java:12)
2.6、unscaledValue()
BigInteger unscaledValue() 此方法返回一个BigInteger,其值是此BigDecimal值的未缩放值。
总结一下就是返回没有小数点的金额,该值计算(此* 10this.scale())。如10.235–>10235 0.32—>32
public static void main(String[] args) {BigDecimal a = new BigDecimal("10.235");BigDecimal b = new BigDecimal("0.32");System.out.println(a.unscaledValue());//10235System.out.println(b.unscaledValue());//32
}
2.7、remainder(BigDecimal divisor)
BigDecimal remainder(BigDecimal divisor) | 返回当前BigDecimal对象除以divisor后的余数。
被除数divisor不能是0否则抛出异常
public static void main(String[] args) {BigDecimal a = new BigDecimal("10");System.out.println(a.remainder(new BigDecimal("2")));// 10%2 = 0a= new BigDecimal("10.23");System.out.println(a.remainder(new BigDecimal("2")));//10.23%2 = 0.23System.out.println(a.remainder(new BigDecimal("0")));//被除数不能是0,否则抛出异常
}
执行结果如下:

2.8、divideAndRemainder(BigDecimal divisor)
BigDecimal[] divideAndRemainder(BigDecimal divisor) 返回当前BigDecimal对象除以divisor后的商和余数,以数组形式返回。
被除数divisor不能是0否则抛出异常
注意:返回的数值会有小数点位数的问题
10.00 ➗ 2 = 5.00
10.00 ➗ 2.000 = 5
public static void main(String[] args) {BigDecimal a = new BigDecimal("10");BigDecimal[] arr = a.divideAndRemainder(new BigDecimal("2"));System.out.println(Arrays.asList(arr));//[5, 0]a= new BigDecimal("10.23");arr = a.divideAndRemainder(new BigDecimal("2"));System.out.println(Arrays.asList(arr));//[5.00, 0.23]a= new BigDecimal("10.23");arr = a.divideAndRemainder(new BigDecimal("2.000"));System.out.println(Arrays.asList(arr));//[5, 0.230]System.out.println(a.divideAndRemainder(new BigDecimal("0")));//被除数不能是0,否则抛出异常
}

三、进阶
3.1、获取BigDecimal整数部分、小数部分、整数位数、小数位数
方式一:
个人觉得用这种方式获取BigDecimal整数部分、小数部分、整数位数、小数位数比较方便
public static void main(String[] args) {BigDecimal a = new BigDecimal("10.23");String money = a.toPlainString();String integer = String.valueOf(a.toBigInteger());//整数部分String point = money.split("\\.").length==1?"":money.split("\\.")[1]; //小数部分System.out.println(integer);//10System.out.println(point);//23
}
相关文章:
java中BigDecimal的介绍及使用(二)
系列文章目录 java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题java中BigDecimal的介绍及使用(二) 文章目录 系列文章目录一、前言二、BigDecimal提供的方法2.1、stripTrailingZeros() 去除小数尾部所有的02.2、int signum()2.3、int…...
NX二次开发UF_MTX3_identity 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX3_identity Defined in: uf_mtx.h void UF_MTX3_identity(double identity_mtx [ 9 ] ) overview 概述 Returns a 3 x 3 identity matrix. 返回一个3 x 3的单位矩阵。 UFUN…...
解决Hadoop DataNode ‘Incompatible clusterIDs‘报错
问题 启动hadoop时报错Failed to add storage directory 2023-11-26 12:02:06,840 WARN common.Storage: Failed to add storage directory [DISK]file:xxx java.io.IOException: Incompatible clusterIDs in xxx/dfs/data: namenode clusterID CID-xxxxxx; datanode cluste…...
计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(系统概述与环境搭建)
计算机毕业设计|基于SpringBootMyBatis框架的电脑商城的设计与实现(系统概述与环境搭建) 该项目分析着重于设计和实现基于SpringBootMyBatis框架的电脑商城。首先,通过深入分析项目所需数据,包括用户、商品、商品类别、收藏、订单…...
神器!使用 patchworklib 库进行多图排版真棒啊
如果想把多个图合并放在一个图里,如图,该如何实现 好在R语言 和 Python 都有对应的解决方案, 分别是patchwork包和patchworklib库。 推介1 我们打造了《100个超强算法模型》,特点:从0到1轻松学习,原理、…...
MySQL -DDL 及表类型
DDL 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:[DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1.CHARACTER SET:…...
主从同步机制
RocketMQ的Broker分为Master和Slave两个角色,为了保证高可用性,Master角色的机器接收到消息后,要把内容同步到Slave机器上,这样一旦Master宕机,Slave机器依然可以提供服务。下面分析Master和Slave角色机器间同步功能实…...
Leetcode算法系列| 3. 无重复字符的最长子串
目录 1.题目2.题解C# 解法一:滑动窗口算法C# 解法二:索引寻找Java 解法一:滑动窗口算法Java 解法二:遍历字符串 1.题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例1: 输入: s "ab…...
Spring Cache(缓存框架)
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…...
android开发:安卓13Wifi和热点查看与设置功能
近日对安卓热点功能做了一些技术验证,目的是想利用手机开热点给设备做初始化,用的是安卓13,简言之: 热点设置功能不可用,不可设置SSID和密码,不可程序控制开启关闭,网上的代码统统都过时了Loca…...
Java中的mysql——面试题+答案——第24期
当涉及MySQL时,面试题可以涵盖更多高级主题、安全性和实践经验。 MySQL中的存储引擎InnoDB和MyISAM的区别是什么? 答案: InnoDB支持事务,而MyISAM不支持。InnoDB使用行级锁,而MyISAM使用表级锁。InnoDB支持外键&#x…...
王者小游戏
游戏里的经验动物 Bear package beast; import sxt.GameFrame; public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\辛欣\\OneDrive\\桌面\\王者荣耀图片(1)\\王者荣耀图片\\beast\\bear.jp…...
using meta-SQL 使用元SQL
%DatePart Syntax %DatePart(DTTM_Column) Description The %DatePart meta-SQL variable returns the date portion of the specified DateTime column. DatePart meta-SQL变量返回指定的DateTime列的日期部分。 Note: This meta-SQL variable is not implemented for COBOL. …...
函数式接口
作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 咱们今天讨论下函数式接…...
使用shell快速查看电脑曾经连接过的WiFi密码
此方法只能查看以前连接过的wifi名称和对应的密码 查看连接过的WiFi名称netsh wlan show profiles查看具体的WiFi名称netsh wlan show profile name"你的wifi名称" keyclear...
通过亚马逊云科技云存储服务探索云原生应用的威力
文章作者:Libai 欢迎来到我们关于“使用亚马逊云科技云存储服务构建云原生应用”的文章的第一部分。在本文中,我们将深入探讨云原生应用的世界,并探索亚马逊云科技云存储服务在构建和扩展这些应用中的关键作用。 亚马逊云科技开发者社区为开发…...
Boot工程快速启动【Linux】
Boot工程快速启动【Linux】 在idea中打包cd usr/在local文件夹下mkdir app进入app文件夹把打包好的文件(只上传其中的jar)上传到app文件下检查linux中的Java版本,保证和项目的Java 版本保持一致运行 java -jar sp补全***.jar想看效果得查询当…...
三 STM32F4使用Sys_Tick 实现微秒定时器和延时
更多细节参考这篇 1. 什么是时钟以及作用 1.1 什么是时钟 时钟是由电路产生的周期性的脉冲信号,相当于单片机的心脏 1.2 时钟对于STM32的作用 指令同步:cpu和内核外设使用时钟信号来进行指令同步数据传输控制: 时钟信号控制数据在内部总…...
唯创知音WT2003H系列MP3录音语音芯片:高精度ADC与DAC,强大IO驱动能力成就音频卓越
在音频领域里,高精度和强大的驱动能力一直是工程师们追求的目标。唯创知音的WT2003H系列MP3录音芯片恰好满足了这一需求,该芯片具备16 bit高精度的ADC及DAC功能,大功率的IO驱动能力,能够直接驱动64mA,为电子产品带来卓…...
记录Windows下安装redis的过程
开源博客项目Blog支持使用EasyCaching组件操作redis等缓存数据库,在继续学习开源博客项目Blog之前,准备先学习redis和EasyCaching组件的基本用法,本文记录在Windows下安装redis的过程。 虽然redis官网文档写着支持Linux、macOS、Windows等…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
