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

  • 相关阅读:
    [FE] uni-app 安装 uview-ui 的两种方式
    [FE] Canvas 转图片并下载的方式
    [K8s] Pod 与容器设计模式 Sidecar
    [Docker] 使 Volume 独立于容器运行时的方式
    mysql授权用户以指定IP登录的方法
    linux安装mysql客户端
    kali 安装 Google Chrome
    KALI图形界面root 用户登入
    git reset 版本回退命令
    git log 常用命令
  • 原文地址:https://www.cnblogs.com/silenceshining/p/15673871.html
Copyright © 2011-2022 走看看