首先我们看一下double类型的数据,计算会出现什么问题?
public static void main(String[] args) {
double amount1 = 0.1;
double amount2 = 1.2;
System.out.println(amount2 - amount1);
}
上边程序的运算结果是:1.0999999999999999
显然这不是我们想要的结果,如果想要得到理想的结果,我们应该使用BigDecimal类型进行计算。
public static void main(String[] args) {
BigDecimal bigDecimal1 = new BigDecimal("0.1");
BigDecimal bigDecimal2 = new BigDecimal("1.2");
System.out.println(bigDecimal2.subtract(bigDecimal1).toString());
}
输出结果:1.1
显然这是我们想要的结果。
转化为BigDecimal对象时,应该用String类型,如果使用double类型转换,依然会出现错误。示例如下:
public static void main(String[] args) {
BigDecimal bigDecimal1 = new BigDecimal(0.1);
BigDecimal bigDecimal2 = new BigDecimal(1.2);
System.out.println(bigDecimal2.subtract(bigDecimal1).toString());
}
输出结果:1.0999999999999999500399638918679556809365749359130859375
如果是除法,且除不尽的情况下,需要保留相应的位数,否则会报错。示例如下:
public static void main(String[] args) {
BigDecimal a1 = new BigDecimal("10");
BigDecimal a2 = new BigDecimal("3");
BigDecimal divide = a1.divide(a2);
System.out.println(divide);
}
报错如下:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1693)
at com.yangsh.meal.common.utils.sys.normal.BigDecimalHelper.main(BigDecimalHelper.java:87)
正确的做法:
@Test
public void divide() {
BigDecimal a1 = new BigDecimal("10");
BigDecimal a2 = new BigDecimal("3");
BigDecimal divide = a1.divide(a2, 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide);
}
输出结果:3.33
例如:一个订单10元,可以买3张票,假如需要退1张票,那么这张票应该退3.3元,后续再退2张票,那么应该是一张3.3元,一张3.4元
尽量使用equals比较,使用==容易出现错误
public static void main(String[] args) {
Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
System.out.println(integer1 == integer2);
}
以上代码输出:false
正确的方式:
public static void main(String[] args) {
Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
System.out.println(integer1.equals(integer2));
}
以上代码输出:true
public static void main(String[] args) {
Integer integer1 = null;
Integer integer2 = new Integer(1);
System.out.println(integer1.equals(integer2));
}
如果Integer为空,则会报空指针错误
Exception in thread "main" java.lang.NullPointerException
at com.example.demo.decimal.BigDecimalUtils.main(BigDecimalUtils.java:35)