zoukankan      html  css  js  c++  java
  • 使用BigDecimal来解决float、double计算时的精度丢失问题

    首先看一个例子:

    package BigDecimalDemo;
    
    public class Demo {
        public static void main(String[] args) {
            double d1 = 0.05;
            double d2 = 0.02;
            System.out.println(d1 - d2);
        }
    }

    输出结果为:

    0.030000000000000002

    这是由于float、double类型在进行计算时存在精度丢失问题,那如何解决呢?

    package BigDecimalDemo;
    
    import java.math.BigDecimal;
    
    public class Demo {
        public static void main(String[] args) {
            double d1 = 0.05;
            double d2 = 0.02;
            BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(d1));
            BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(d2));
            System.out.println(bigDecimal1.subtract(bigDecimal2).doubleValue());
        }
    }

    输出结果为:

    0.03

    但需要特别注意,一定要使用参数为string的构造函数,不然仍会有问题,如下:

    package BigDecimalDemo;
    
    import java.math.BigDecimal;
    
    public class Demo {
        public static void main(String[] args) {
            double d1 = 0.05;
            double d2 = 0.02;
            BigDecimal bigDecimal1 = new BigDecimal(d1);
            BigDecimal bigDecimal2 = new BigDecimal(d2);
            System.out.println(bigDecimal1.subtract(bigDecimal2).doubleValue());
        }
    }

    输出结果为:

    0.030000000000000002

     另外,在比较BigDecimal是否相等时,看以下例子:

    package BigDecimalDemo;
    
    import java.math.BigDecimal;
    
    public class CompareDemo {
        public static void main(String[] args) {
            BigDecimal bigDecimal1 = new BigDecimal("0.1");
            BigDecimal bigDecimal2 = new BigDecimal("0.10");
            System.out.println(bigDecimal1.equals(bigDecimal2));
            System.out.println(bigDecimal1.compareTo(bigDecimal2));
        }
    }

    结果为:

    false
    0

    0.1和0.10使用equals比较时是不相等的,而使用compareTo比较是相等的。

  • 相关阅读:
    六、order set结构及命令详解
    五、set结构及命令详解
    四、redis的link结构及命令详解
    三、redis对字符串类型的操作
    二、redis对于key的操作命令
    一、redis的特点以及安装使用
    Mysql5.7以上版本group by报错问题
    1.4 java高并发程序设计-无锁
    sysbench工具和mysql的基准测试
    sqli-labs(29-31关)
  • 原文地址:https://www.cnblogs.com/silenceshining/p/15673871.html
Copyright © 2011-2022 走看看