运算常见问题

运算常见问题

浮点数常见问题

1.double类型计算问题

首先我们看一下double类型的数据,计算会出现什么问题?

    public static void main(String[] args) {
        double amount1 = 0.1;
        double amount2 = 1.2;
        System.out.println(amount2 - amount1);
    }

上边程序的运算结果是:1.0999999999999999

显然这不是我们想要的结果,如果想要得到理想的结果,我们应该使用BigDecimal类型进行计算。

2.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

显然这是我们想要的结果。

注意事项: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

注意事项:2.无法除尽问题

如果是除法,且除不尽的情况下,需要保留相应的位数,否则会报错。示例如下:

    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

注意事项:3.计算场景,应该考虑除不尽的情况

例如:一个订单10元,可以买3张票,假如需要退1张票,那么这张票应该退3.3元,后续再退2张票,那么应该是一张3.3元,一张3.4元

整数类型比较

1.Integer类型比较

尽量使用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

注意事项:避免null
    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)

你可能感兴趣的:(常见错误,java,运算错误,计算错误,除不尽)