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

     

  • 相关阅读:
    对MIME格式的邮件文件进行解码获取其可读内容和附件等
    终于知道RTM的含义了
    当CodeSmith不在时……
    windows server 2008 设置多用户同时远程登录
    关于FAST比较全的博文
    安装web apps
    添加RMS问题
    安装Fast Search For Sharepoint 2010
    sharepoint 2010 企业SN
    安装exchange出错
  • 原文地址:https://www.cnblogs.com/zhangcaihua/p/14650568.html
Copyright © 2011-2022 走看看