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
仅以此记录学习中遇到的错误,以便以后查找。