原文链接:https://blog.csdn.net/yacolspace/article/details/78287394

double类型数据加减操作精度丢失问题

今天在项目中用到double类型数据加减运算时,遇到了一个奇怪的问题,比如1+20.2+300.03,理论上结果应该是321.23,其实结果并不是这样。

public double add() {        double number1 = 1;        double number2 = 20.2;        double number3 = 300.03;        double result = number1 + number2 + number3;        System.out.println(result);        return result;    }

打印结果如下:

这是为什么呢?又该如何解决呢?

在使用Java中double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法,我们只考虑两个进行比较,分别是

BigDecimal(double val)          Translates a double into a BigDecimal.BigDecimal(String val)          Translates the String repre sentation of a BigDecimal into a BigDecimal.

上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。我们可能想都不想就用上了,会有什么问题呢?

现贴出BigDecimal的一个构造函数的文档供大家参考

解决方法

相信从上面的文档大家也已经找出了解决方法,在需要精确的表示两位小数时我们需要把他们转换为BigDecimal对象,然后再进行运算。

另外需要注意,使用BigDecimal(double val)构造函数时仍会存在精度丢失问题,建议使用BigDecimal(String val)。这就需要先把double转换为字符串然后在作为BigDecimal(String val)构造函数的参数。转换为BigDecimal对象之后再进行加减乘除操作,这样精度就不会出现问题了。这也是为什么有关金钱数据存储都使用BigDecimal。

处理double类型数据的加、减、乘、除运算时,使用如下方法:

/**     * 加法运算     * @param m1     * @param m2     * @return     */    public static double addDouble(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 subDouble(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 

验证文章开头提到的问题是否解决,

public double addDouble() {        double result1 = add(1, 20.2);        double result2 = add(result1, 300.03);        System.out.println("使用BigDecimal时结果值:" + result2);        return result2;    }

打印结果值

跟预想中的结果值一样,解决了double类型数据加减操作时精度丢失的问题。

double operator[](int i)_java中double类型精度丢失问题及解决方法相关推荐

  1. double类型精度丢失问题以及解决方法

    double类型精度丢失问题: (1)加法运算. public static void main(String[] args) {double number1 = 1;double number2 = ...

  2. java中double类型精度丢失问题及解决方法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源: https://blog.csdn.net/yacolsp ...

  3. double java 精度丢失_java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  4. [ JAVA编程 ] double类型计算精度丢失问题及解决方法

    [ JAVA编程 ] double类型计算精度丢失问题及解决方法 参考文章: (1)[ JAVA编程 ] double类型计算精度丢失问题及解决方法 (2)https://www.cnblogs.co ...

  5. php的strpos不支持数字,php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创...

    php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创 这里有新鲜出炉的 PHP 面向对象编程,程序狗速度看过来! PHP 开源脚本语言 PHP(外文名: Hypertext Prep ...

  6. php判断是字符串类型,php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创...

    本文实例讲述了php使用strpos判断字符串中数字类型子字符串出错的解决方法.分享给大家供大家参考,具体如下: 一.问题: 最近的开发中在程序代码里有一个随机数是否在给定字符串里的判断,我用了如下的 ...

  7. java steam 去重_Java中对List去重 Stream去重的解决方法

    问题 当下互联网技术成熟,越来越多的趋向去中心化.分布式.流计算,使得很多以前在数据库侧做的事情放到了Java端.今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Ja ...

  8. 命名空间“System.Web”中不存在类型或命名空间名称“Optimization”解决方法

    在App_Code中添加BundleConfig.cs using System.Web.Optimization; public class BundleConfig {     public st ...

  9. java显示汉字乱码怎么办_java中的汉字显示问号乱码怎么解决

    java中的汉字显示问号乱码怎么解决 发布时间:2020-06-23 22:16:38 来源:亿速云 阅读:97 作者:元一 java中的汉字显示问号乱码怎么解决?针对这个问题,今天小编总结了这篇文章 ...

最新文章

  1. SpringMVC 异常统一处理
  2. 设计模式总结(Java)—— 观察者模式
  3. gis 联合 融合_GIS技术进化 | 我们为何需要跨平台GIS技术体系?
  4. css元素居中实现方法
  5. Python 数据结构与算法 —— Kruskal 算法
  6. 1.3多媒体存储技术
  7. 京瓷打印机p5026cdn_京瓷p5026cdn驱动下载-京瓷p5026cdn打印机驱动v2.0.1421 官方版 - 极光下载站...
  8. php获取视频封面图,PHP爬虫 获取 Bilibili 视频封面图
  9. c语言厘米换算分米程序设计,厘米和分米换算(米和厘米换算)
  10. 含辞未吐,声若幽兰,史上最强免费人工智能AI语音合成TTS服务微软Azure(Python3.10接入)
  11. 【Access2003】表的新建、用sql语句查询;关闭警告信息;修改数据库密码;修复数据库
  12. Android蓝牙自动配对Demo,亲测好使!!!
  13. 明明是那么好的人,却又是那么伤人的人
  14. 微信小程序(四)会员专区
  15. 软件测试/测试开发丨必知必会的Docker 命令
  16. APP接入微信支付流程
  17. android 11.0 开机动画横屏显示
  18. DRV8824,DRV8825新的解决方案
  19. Python 数据分析概述
  20. win7和win10系统的安装教程

热门文章

  1. 延边大学c语言题库,延边大学-SPOC官方网站
  2. python压缩算法_LZ77压缩算法编码原理详解(结合图片和简单代码)
  3. arcgis快速创建斜坡单元剖面线
  4. 使用C#代码部署SharePoint 2013开发包简单总结(一)
  5. UWP开发入门教程备忘
  6. 【JS 逆向百例】X球投资者社区 cookie 参数 acw_sc__v2 加密分析
  7. 完美解决 bash: hexo: command not found
  8. PWN-PRACTICE-BUUCTF-22
  9. 与gps优缺点_长缨在手,敢缚苍龙,中国北斗三号圆满收官,相比美国GPS怎样?...
  10. 织梦php echo 调用金币,dedecms实现任意页面调用当前会员信息的方法