我们经常要比较两个数字是否相等,两个数字可以是整数、小数,我们也知道浮点数如float、double在java里是不准确的,那就会使用到BigDecimal来比较,那有些坑就必须先理清楚。
结论:
b1.compareTo(b2) == 0构造器有很多,用用 new BigDecimal(String) 或 BigDecimal.valueOf 来得到BigDecimal!!!,不能用其他如int/long/double的构造器。否则可能会出现坑,见"坑1"
// 正例
BigDecimal b1 = new BigDecimal("0.1");
// 反例
BigDecimal b2 = new BigDecimal(0.1);
// 正例
double d = 0.1;// 比如接口传入或库中查出的值是非字符串,如何构造?
BigDecimal b1 = BigDecimal.valueOf(d);
// 【补充】:BigDecimal.valueOf 的底层用的就是字符串的构造器
public static BigDecimal valueOf(double val) {
// Reminder: a zero double returns '0.0', so we cannot fastpath
// to use the constant ZERO. This might be important enough to
// justify a factory approach, a cache, or a few private
// constants, later.
return new BigDecimal(Double.toString(val));
}
使用 compareTo() 方法,不要用equals!!!
BigDecimal b1 = new BigDecimal("1.0");
BigDecimal b2 = new BigDecimal("1.00");
// 正例
System.out.println(b1.compareTo(b2) == 0);// 等于0表示两者相等,会忽略精度
// 反例
System.out.println(b1.equals(b2));// 返回false因为两者精度不一样即使实际值一样但最终返回false
转为BigDecimal进行比较!不要用字符串比较!!!
其中一个是字串,另一个是BigDecimal
String value1 = "0.1";
BigDecimal b = new BigDecimal("0.10");
// 将String转为BigDecimal再用compareTo比较
BigDecimal v = new BigDeimal(value1);// 要确保value1能够转为数字,如果value1是abc这样的字串会出现NumberFormatExcception
System.out.println(b.compareTo(v));
两个都是字串:都转为compareTo进行比较
精度就是小数点后的位数(官方文档解释得很复杂…)
System.out.println(new BigDecimal("1").scale());// 0
System.out.println(new BigDecimal("1.0").scale());// 1
System.out.println(new BigDecimal("1.00").scale());// 2
System.out.println(new BigDecimal("1.010").scale());// 3
System.out.println(new BigDecimal("0").scale());// 0
System.out.println(new BigDecimal("-0").scale());// 0
System.out.println(new BigDecimal("-1").scale());// 0
System.out.println(new BigDecimal("-1.00").scale());// 2
System.out.println(new BigDecimal("-1.1").scale());// 1
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal(0.1);
System.out.println(b1);// 打印:0.1
System.out.println(b2);// 打印:0.1000000000000000055511151231257827021181583404541015625
System.out.println(b1.compareTo(b2));// -1,说明b1小于b2
BigDecimal b1 = new BigDecimal("1.0");
BigDecimal b2 = new BigDecimal("1.00");
System.out.println(b1 == b2);// false,因为是不同的对象
System.out.println(b1.equals(b2));// false,因为scale不一样
System.out.println(b1.compareTo(b2));// 0,0就是两者相等。compareTo会忽略精度
这些问题请自行再研究