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

     

  • 相关阅读:
    十大经典算法总结
    十大经典算法总结
    MySQL主从同步模拟
    MySQL主从同步模拟
    高斯定理
    高斯定理
    如何修改数据决策系统登陆地址为ip
    如何修改数据决策系统登陆地址为ip
    数据库连接池问题 Max Pool Size
    数据库连接池问题 Max Pool Size
  • 原文地址:https://www.cnblogs.com/zhangcaihua/p/14650568.html
Copyright © 2011-2022 走看看