Java中比较BigDecimal

1. BigDecimal是什么

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

float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。

BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。

也不能用==和.equals()来对BigDecimal进行比较,因为BigDecimal是个对象引用类型

对于对象引用类型:“==”比较的是对象的内存地址,且在计算机内存中,存储浮点数(单精度float和双精度double)时使用的是IEEE 754标准,就会有精度问题,在储存和准换的过程中浮点数容易引起一些较小的舍入误差。

所以我们不能使用“==”这种严格意义上的相等 来比较浮点数

.equals()方法会受数值的位数的影响,从而可能产生不正确的结果
(以上参照了百度百科)

额外知识点:《阿里巴巴Java开发手册》中有提到:在浮点数之间进行等值判断时,浮点数的基本数据类型(float、double)不能用==来比较,浮点数的包装数据类型(Float、Double)不能用 equals 来判断。

2. 代码实例

2.1. 不能用==比较Decimal的原因(代码)

在这里插入图片描述
因为==比较的是存放地址,所以会返回false

2.2. 不能用.equals()比较Decimal的原因(代码)

在这里插入图片描述
在这里插入图片描述
有可能导致出现错误的结果

3. 用于比较BigDecimal的正确方法

a.compareTo(b) : 返回 -1 表示 a 小于 b,0 表示 a 等于 b , 1表示 a 大于 b
在这里插入图片描述
在这里插入图片描述

4. 关于BigDecimal的一些方法

setScale(int x); 保留x位小数

setScale(x, BigDecimal.ROUND_DOWN); 保留1位小数,默认用四舍五入

setScale(x, BigDecimal.ROUND_HALE_UP); 保留一位小数,向上舍入

setScale(x, BigDecimal.ROUND_HALF_DOWN); 保留一位小数,向下舍入

参考的相关博客链接:https://blog.csdn.net/weixin_43901865/article/details/112566955
https://blog.csdn.net/whk_15502266662/article/details/107982039

仅以此记录学习中遇到的错误,以便以后查找。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值