zoukankan      html  css  js  c++  java
  • 使用BigDecimal丢失精度的问题

    使用BigDecimal丢失精度的问题

    通常使用double时会需要运算,但是往往出现精度丢失的问题:

    double d1 = 0.01;
    double d2 = 0.1;
    System.out.println(d2 - d1);
    //输出
    0.09000000000000001

    常识告诉我们使用BigDecimal能解决精度丢失的问题:

    BigDecimal b1 = new BigDecimal(0.01);
    BigDecimal b2 = new BigDecimal(0.1);
    System.out.println(b2.subtract(b1));
    //输出
    0.09000000000000000534294830600856585078872740268707275390625

    还是丢失了精度,为什么呢?

    在BigDecimal传double参数的构造方法中,有这样一句话“The results of this constructor can be somewhat unpredictable.”意思是这个构造函数的结果在某种程度上是不可预测的。所以初始化BigDecimal时传入double的方式不可取。

    如何不丢失精度?

    1,使用Double.toString方法转字符串

    BigDecimal b1 = new BigDecimal(Double.toString(0.01));
    BigDecimal b2 = new BigDecimal(Double.toString(0.1));
    System.out.println(b2.subtract(b1));
    //输出
    0.09

    2、直接传入一个字符串

    BigDecimal b1 = new BigDecimal("0.01");
    BigDecimal b2 = new BigDecimal("0.1");
    System.out.println(b2.subtract(b1));
    //输出
    0.09

    3、使用BigDecimal.valueOf方法

    BigDecimal b1 = BigDecimal.valueOf(0.01);
    BigDecimal b2 = BigDecimal.valueOf(0.1);
    System.out.println(b2.subtract(b1));
    //输出
    0.09

     

  • 相关阅读:
    Java中文语言处理HanLP
    python的jieba分词词性标注(转载)
    solr 自聚类实现
    IntelliJ IDEA 创建 java Maven项目
    javat Itext实践 pdf
    java 中PriorityQueue优先级队列使用方法
    java实现 tf-idf
    Solr6.6 IK 中文分词的配置和使用
    yaha分词
    实现自动文本摘要(python,java)
  • 原文地址:https://www.cnblogs.com/zhangcaihua/p/14650568.html
Copyright © 2011-2022 走看看