当前位置: 首页 > news >正文

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&#xff1a…...

主从同步机制

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等…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...