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比较是相等的。

  • 相关阅读:
    SpringDataJpa
    #pragma pack(n)的使用
    jquery中的ajax方法参数
    rapidjson的使用
    Linux下Qt安装
    jsoncpp 0.5 ARM移植
    GoAhead2.5移植到ARM教程
    Qt 4.7.2移植到ARM教程
    虚函数与纯虚函数的区别
    海康、大华IpCamera RTSP地址和格式
  • 原文地址:https://www.cnblogs.com/silenceshining/p/15673871.html
Copyright © 2011-2022 走看看