开发项目的过程中遇到了一个Bigdecimal的问题,看似很低级,但是确实难到我了😂,记录一下。需求如下:
需求
判断两个BigDecimal类型的数值谁大。
- 如果两个值相等条件成立
- 如果 两数上下相差0.1 也成立
常规判断
BigDecimal类型比较特殊,假设我们有以下两个BigDecimal字段,比较两个值谁大谁小,可以发现他是编译报错的,会提示编译报错信息:Operator '>' cannot be applied to 'java.math.BigDecimal', 'java.math.BigDecimal'
就是说 **操作符 >
不能应用于 java.math.BigDecimal
类型。
那既然不能使用 >
我们怎么判断谁大谁小嘞。我们可以使用 compareTo
compareTo方法的作用是BigDecimal大小的比较。两个值比较,最终返回的是一个int类型数字,而不是true和false。
一般两个值比较的时候无非就是三大种情况,大于、小于、等于,与之对应的是 1 、-1、 0。
- 大于 = 1
- 小于 = -1
- 于 = 0
具体的使用方法可以参考这篇文章:https://blog.csdn.net/chenHaiJaheike/article/details/107516390?spm=1001.2014.3001.5501
弊端
虽然使用 compareTo
去判断两个BigDecimal值谁大谁小但是有这种需求是不满足的,假如:要判断两个BigDecimal上下相差某个金额的时候是无法做出判段的。
public static void main(String[] args) {
BigDecimal a = new BigDecimal("1.1");
BigDecimal b = new BigDecimal("1.3");
//1、a等于b条件成立
//2、a和b的差 大于等于 0.1
//3、a和b的差 小于等于 0.1
BigDecimal subtract = a.subtract(b);
//写法不成立,报错
if (subtract > new BigDecimal("0,1")){
}
//写法没问题但是最终只能返回 0 、1 -1等等,无法判断是否大于0.1
if (subtract.compareTo(new BigDecimal("0,1")) == 0){
}
}
解决方案
这个时候我们要借助取正函数进行操作,返回具体数值进行比较的出判断结果。
@Test
public void testTest(){
BigDecimal a = new BigDecimal("5.30");
BigDecimal b = new BigDecimal("5.29");
double abs = Math.abs(a.subtract(b).doubleValue());
System.out.println(abs);
if(abs<= 0.1){
System.out.println("条件成立,进入判断");
}
}