BigDecimal使用

news/2025/3/17 5:51:16/文章来源:https://www.cnblogs.com/biggerapple/p/18503772

常见方法

我们在使用 BigDecimal 时,为了防止精度丢失,推荐使用它的BigDecimal(String val)构造方法或者 BigDecimal.valueOf(double val) 静态方法来创建对象。
《阿里巴巴 Java 开发手册》对这部分内容也有提到,如下图所示。

加减乘除

add 方法用于将两个 BigDecimal 对象相加,subtract 方法用于将两个 BigDecimal 对象相减。multiply 方法用于将两个 BigDecimal 对象相乘,divide 方法用于将两个 BigDecimal 对象相除。

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.add(b));// 1.9
System.out.println(a.subtract(b));// 0.1
System.out.println(a.multiply(b));// 0.90
System.out.println(a.divide(b));// 无法除尽,抛出 ArithmeticException 异常
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP));// 1.11

这里需要注意的是,在我们使用 divide 方法的时候尽量使用 3 个参数版本,并且RoundingMode 不要选择 UNNECESSARY,否则很可能会遇到 ArithmeticException(无法除尽出现无限循环小数的时候),其中 scale 表示要保留几位小数,roundingMode 代表保留规则。

public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {return divide(divisor, scale, roundingMode.oldMode);
}

BigDecimal 等值比较问题

《阿里巴巴 Java 开发手册》中提到:

BigDecimal 使用 equals() 方法进行等值比较出现问题的代码示例:

BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("1.0");
System.out.println(a.equals(b));//false

这是因为 equals() 方法不仅仅会比较值的大小(value)还会比较精度(scale),而 compareTo() 方法比较的时候会忽略精度。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低功耗4G模组:FTP应用示例

​ 一、FTP 概述 FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。 FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。 其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于 FTP 服务器上的资源。在开发网站的时候,…

「FHQ_Treap」学习笔记

一、前言 & 基本理论 来自笔者的肯定:最容易理解且比较好写的平衡树(不过就是常数有点大了),可能是笔者花了较长的时间去理解旋转 Treap 和 Splay 的旋转吧()。FHQ 不仅比旋转法编码简单,而且能用于区间翻转、移动、持久化等场合。——《算法竞赛》FHQ_Treap 的所有…

鲜花-CSP2024 游记

前言 坐标 \(\text{SX}\),去年 \(\text{CSP}\) 和 \(\text{NOIP}\) 都爆炸了,于是这就是我最后一年了。 初赛 赛前随便做了三份题,可以随便过线就放下不管了。 赛时光速写完选择,然后被状压题硬控,没太看懂在求什么,有点慌乱,后面的完善程序二分题很快写上去了,但是 \(…

如何使用NTP同步时间?

​ 一、NTP通信概述 很多场景中,由于业务需要,模块需要保持正确的系统时钟,才能正常工作。但是模块上电后的初试时间戳是946713600(即2000/01/01,16:00:00),所以同步时钟成为了开发者要解决的重要问题。对于Cat.1模块,移动/电信卡,通常会下发基站时间,那么sntp就不是必要…

工地升降机AI人数识别系统

工地升降机人数识别系统采用了AI神经网络和深度学习算法,工地升降机AI人数识别系统通过升降机内置的摄像头实时监测轿厢内的人员数量。通过图像处理和人脸识别算法,系统能够精确地识别升降机内的人数。一旦系统识别到人数达到或者超过设定的阈值,工地升降机AI人数识别系统会…

楼道堆积物视觉识别监控系统

楼道堆积物视觉识别监控系统采用了AI神经网络和深度学习算法,楼道堆积物视觉识别监控系统通过摄像头实时监测楼道的情况,通过图像处理、物体识别和目标跟踪算法,系统能够精确地识别楼道通道是否被堆积物阻塞。楼道堆积物视觉识别监控系统检测到堆积物的存在,立刻通过告警信…

变电站人员安全作业行为识别监测系统

变电站人员安全作业行为识别监测系统采用了AI神经网络和深度学习算法,变电站人员安全作业行为识别监测系统通过利用已装好的监控摄像头,进行人员行为分析。针对未穿戴安全帽、工作服、安全马甲、绝缘靴等不符合安全要求的行为,系统能够实时识别并发出预警,提醒工作人员及时…

redis数据库操作指令

一、数据库操作指令 2、redis中库说明 对于一个redis服务而言,包含默认有16个数据库给我们使用,从0开始编号,共15号数据库,默认使用的是0号数据库 切换库,select 库号 举例:使用1号库:select 1 库和库之间数据不共享 库和库之间的键可以重名 2、redis中清空库的指令清空…

AI智能识别未穿工作服识别

AI智能识别未穿工作服识别系统采用了AI神经网络和深度学习算法,AI智能识别未穿工作服识别系统通过现场监控摄像头对特定区域内工人的穿戴情况进行实时监测和分析。系统经过大量的数据训练和算法优化,能够准确识别工人是否穿戴合规的工作服、反光衣、安全帽等装备。AI智能识别…

从零开始学五笔(五):撇区字根

介绍下撇区的字根讲解格式:先介绍按键的区位号、口诀内容、口诀说明 然后列每个字根能组成什么汉字,难拆字将用中括号标出‍ T 键 区位号:31 口诀:禾竹一撇双人立,反文条头共三一 说明:禾:一个字根竹:指的是竹字头 ⺮一撇:作为撇区的第一个键,有一个字根为 丿双人立:…

从零开始学五笔(七):折区字根

介绍下折区的字根讲解格式:先介绍按键的区位号、口诀内容、口诀说明 然后列每个字根能组成什么汉字,难拆字将用中括号标出‍ N 键 区位号:51 口诀:已半巳满不出己,左框折尸心和羽 说明:已半巳满不出己:指的是“已”,“巳”,“己”三个字的不同之处,“已”字半封口,“…

从零开始学五笔(六):捺区字根

介绍下捺区的字根讲解格式:先介绍按键的区位号、口诀内容、口诀说明 然后列每个字根能组成什么汉字,难拆字将用中括号标出‍ Y 键 区位号:41 口诀:言文方广在四一,高头一捺谁人去 说明:言:字根,还有个变体为言字旁“讠” 文,方,广,都是字根 高头:指的是“高”字的上…