double类型的数据做加和操作 时会丢失精度,如下操作结果为:

int a = 3;
        double b = 0.03;
        double c = 0.03;

double d = a + b + c;

System.out.println("first d:" + d);

结果:first d:3.0599999999999996

如果用java.math包中的BigDecima类并用String来构造加和操作则结果会保持正确。操作如下:

public class TestBigDecimalDemo {

/**
     * 测试BigDecimal 在进行算数计算时不会丢失精度。--一般的数值类型在进行 金融类数据计算时会丢失精度。
     * @param args
     */
    public static void main(String[] args) {
//        double result = add(1.00000000000000001, 1.00000000000000001);
//        //result = 2.0 丢失了精度
//        System.out.println(result);
        
        int a = 3;
        double b = 0.03;
        double c = 0.03;
        //不会丢失精度
        double d = add(add(a, b),c);
        System.out.println("first d:" + d);
        //会丢失精度
        d = a+b+c;
        System.out.println("second d:" + d);
        
    }
    
     /**
     * 加法运算
     * @param m1
     * @param m2
     * @return
     */
    public static double add(double m1, double m2) {
        BigDecimal p1 = new BigDecimal(Double.toString(m1));
        BigDecimal p2 = new BigDecimal(Double.toString(m2));
        return p1.add(p2).doubleValue();
    }

/**
     * 减法运算
     * @param m1
     * @param m2
     * @return
     */
    public static double sub(double m1, double m2) {
        BigDecimal p1 = new BigDecimal(Double.toString(m1));
        BigDecimal p2 = new BigDecimal(Double.toString(m2));
        return p1.subtract(p2).doubleValue();
    }

/**
     * 乘法运算
     * @param m1
     * @param m2
     * @return
     */
    public static double mul(double m1, double m2) {
        BigDecimal p1 = new BigDecimal(Double.toString(m1));
        BigDecimal p2 = new BigDecimal(Double.toString(m2));
        return p1.multiply(p2).doubleValue();
    }

/**    
      *  除法运算
      *   @param   m1  
      *   @param   m2        
      *   @param   scale      
      *   @return     
      */     
    public static double div(double m1, double m2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("Parameter error");
        }
        BigDecimal p1 = new BigDecimal(Double.toString(m1));
        BigDecimal p2 = new BigDecimal(Double.toString(m2));
        return p1.divide(p2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

}

输出结果为:3.06

double类型数据做加和操作时会丢失精度问题处理相关推荐

  1. android double值排序,android根据Double类型数据经纬度算出距离再根据距离实现排序功能...

    前言 项目中用到全国的加油站数据加载 并根据经纬度算出距离 然后根据距离从小到大排序 主要是数据类型是Double 这里必须对数据进行封装 实现也不难 这里讲一下自己的实现方法和实现思路 效果图 先来 ...

  2. Java学习之double类型数据比较

    Java学习之double类型数据比较 对于两个double类型的数据,是不能直接用==来比较是否相等 double a=1.01; double b=1.01; if(b==a){System.ou ...

  3. 深入理解C++浮点数(float、double)类型数据比较、相等判断

    深入理解C++浮点数(float.double)类型数据比较.相等判断 浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾 ...

  4. 7-7 硬币找钱问题 (10 分)(思路+详解+double类型数据的处理)Come baby!!!!!!!!!!!!!!!!!!!!

    一:题目 设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元.现要用这些面值的硬币来购物.在购物中希望使用最少个数硬币.例如,1 次购物需要付款0.55 元,如果 ...

  5. VS Code写C语言输出long double类型数据不正确的问题

    VS Code写C语言输出long double类型数据不正确的问题 在学习<C Primer Plus>一书时遇到一个例题 #include <stdio.h>int mai ...

  6. java double 类型_关于Java中的double类型数据

    在初学Java的时候,一般我们都会从基本的数据类型开始学习,而在基本数据类型中,我认为double类型是比较难理解的,并且在以后的学习或工作中,在double类型数据这遇到的坑也是极多的.例如下面的这 ...

  7. c语言中数据精度发生错误,C语言Double类型数据保证精度有关问题

    C语言Double类型数据保证精度问题 我用手算算出的数据为-1.35323517,但是在C语言里面为了保证数据精度,VC++运行的结果为-1.35323517024517 ,按说应该在-1.3532 ...

  8. C语言double数据加减,double类型数据的加减乘除

    import java.math.BigDecimal; /** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入. */ public ...

  9. mysql的double类型数据_mysql数据类型double和decimal区别详解

    实数是带有小数部分的数字.然而,它们不只是为了存储小数部分,也可以使用 DEClMAL 存储比 BIGINT还大的整数. MySQL 既支持精确类型,也支持不精确类型. FLOAT 和  DOUBLE ...

最新文章

  1. python数据结构与算法:单向链表
  2. Hinton最新专访:别让AI解释自己,AI寒冬不会再来
  3. [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
  4. showmount -e (CVE-1999-0554) NFS漏洞解决方案
  5. python + opencv: kalman 跟踪
  6. 测试工作笔记001---web测试_工作经验_注意点_随时更新
  7. 可以用AppleWatch解鎖iPhone
  8. Java的BIO,NIO和AIO的区别于演进
  9. Spark性能优化指南——高级篇【2】
  10. tensorflow--之将数字标签转化为one-hot
  11. 计算机学业水平测试表格题,2010 年信息技术学业水平考试试题
  12. 学习笔记(43):R语言入门基础-plot绘制箱体图
  13. Unity 之 发布字节抖音小游戏
  14. 华为硬件工程师社招机考题库_华为电子软硬件工程师招聘笔试题
  15. Python实现带不等式约束的NSGAII算法解决cec2021中的RCM01问题
  16. 当当网 R 语言学习资料统计分析
  17. 企业引入大数据/AI 的难点,落地方式以及行业阶段
  18. 关于自由移站法及坐标转换模型的综述
  19. html5读取ic卡,企业员工IC卡考勤系统(IC卡读写)
  20. android 蜂巢平台,Android 3.2来临 蜂巢系统平板详解析

热门文章

  1. sqlserver与mysql的一些不同的T-SQL语句
  2. 【信息系统项目管理师】第8章-项目质量管理 知识点详细整理
  3. 小白使用Eclipse 的基本设置
  4. 我的.emacs(Ubuntu版)
  5. Android内核开发:如何统计系统的启动时间
  6. Android SurfaceView双缓存
  7. SpringBoot之lombok引入后@Data无法生成getset方法
  8. mysql数据库逻辑备份与恢复_Mysqldump逻辑备份与恢复
  9. dedecms怎么改php版本_php.ini配置中有3处设置不当会使网站存在安全问题
  10. abb变频器acs880说明书_ABB变频器ACS880-104/ACS880-204/ACS880-304产品参数及功能介绍