在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5。但是问题总是如此吗?

下面我们让下面两个doubles数相加,然后看看输出结果:

@Test

public void testBig(){

System.out.println(0.11+2001299.32);

}

控制台输出2001299.4300000002

我们吃惊的发现,结果并不是我们预想的那样,这是为什么呢?又如何解决呢?

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

BigDecimal

public BigDecimal(double val)

将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最小值。

注:

此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。

当 double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。

解决方法:

相信从上面的文档大家也已经找出了解决方法,

在需要精确的表示两位小数时我们需要把他们转换为BigDecimal对象,然后再进行运算。

另外需要注意

使用BigDecimal(double val)构造函数时仍会存在精度丢失问题,建议使用BigDecimal(String val)

这就需要先把double转换为字符串然后在作为BigDecimal(String val)构造函数的参数。转换为BigDecimal对象

之后再进行加减乘除操作,这样精度就不会出现问题了。这也是为什么有关金钱数据存储都使用BigDecimal。

@Test

public void testBig(){

System.out.println(0.11+2001299.32);//非精确的输出

BigDecimal bigDecimal1 = new BigDecimal(Double.toString(0.11));

BigDecimal bigDecimal2 = new BigDecimal(Double.toString(2001299.32));

System.out.println(bigDecimal1.add(bigDecimal2));//精确的输出

}

控制台输出:

2001299.4300000002

2001299.43

参考资料:http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/math/BigDecimal.html

转载注明出处:https://www.cnblogs.com/cblogs/p/double-precision.html

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

前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...

java中double和float精度丢失问题

为什么会出现这个问题呢,就这是java和其它计算机语言都会出现的问题,下面我们分析一下为什么会出现这个问题:float和double类型主要是为了科学计算和工程计算而设计的.他们执行二进制浮点运算,这 ...

java防止double和float精度丢失的方法

在浮点数当中做运算时经常会出现精度丢失的情况,如果做项目不作处理的话会对商家造成很大的影响的.项目尤其是金融相关的项目对这些运算的精度要求较高. 问题原因:首先计算机进行的是二进制运算,我们输入的十进 ...

iOS项目double、float精度丢失解决办法

描述 在iOS项目中老是遇到double.float精度丢失的问题 PS: NSString * jsonStr = @"{\"9.70\":9.70,\"67 ...

Java中常见的几个乱码问题以及解决方法

1.ajax--URL中的参数含中文,后台接受的参数出现乱码 解决方法: 第一步:在javascript中,对url进行两次编码 url = "http://localhost:8080/M ...

1.Float精度在JS的解决方法

最近做了一个有关折扣价的计算的功能,所有的运算都是在前台通过js来做,做完之后经过手工核算发现了一个问题,当时做的一个例子是10*0.94,按照我们正常的思维,这个结果应该是9.4,但是在js中的计算 ...

[坑]c#中double转字符串精度丢失问题记录

在项目遇到了一个比较大的double值,然后出现了一些意想不到的状况: double b=1141.161994934082; b.ToString();//'1141.16199493408' 然后 ...

Float精度 在JS的解决方法

最近在做一个工资核算的系统,所有的运算全部在前台进行,因此用了的是JS来做. 做完以后,经手工核算,发现一个奇怪的问题.就是JS算出来的结果跟用计算器算出来的结果有差距. 想了很久,也没有想出问题出在 ...

Java中浮点型数据Float和Double进行精确计算的问题

Java中浮点型数据Float和Double进行精确计算的问题 来源  https://www.cnblogs.com/banxian/p/3781130.html 一.浮点计算中发生精度丢失     ...

随机推荐

【转载】#273 - Parameter Modifier Summary

Here's a summary of the different parameter modifiers and how the behavior changes for each, when us ...

eclipse 最全快捷键(网络收集)

Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+ ...

Android进阶笔记12:Manymo(在线安卓系统模拟器工具)

Manymo: 在线安卓系统模拟器工具是一款启动速度快,且在浏览器中就能运行流畅.你可以使用它来测试你的安卓应用,他最多能支持42种屏幕尺寸和系统版本. 长久以来,Android开发者面临的困境之一就 ...

Bone Collector(ZeroOnebag)

Bone Collector Problem Description Many years ago , in Teddy’s hometown there was a man who was call ...

自己定义View常处理的回调函数

onFinishInflate() 当View中全部的子控件均被映射成xml后触发 onMeasure(int, int) 确定全部子元素的大小 onLayout(boolean, int, int, ...

http常见状态码(转载)

常见HTTP状态码 常见HTTP状态码 200 OK 301 Moved Permanently 302 Found 304 Not Modified 307 Temporary Redirect 4 ...

使用pip命令自动生成项目安装依赖清单

Python项目中经常会带requirements.txt文件,里面是项目所依赖的包的列表,也就是依赖关系清单,这个清单也可以使用pip命令自动生成. pip命令: 1 pip freeze > ...

Linux下网卡绑定模式

Linux bonding驱动一共提供了7种模式,它们分别是:balance-rr .active-backup.balance-xor.broadcast.802.3ad.balance-tlb.b ...

manifold 微分流形上可以定义可微函数、切向量、切向量场、各种张量场等对象并建立其上的分析学,并可以赋予更复杂的几何结构以研究它们的性质。

小结: 1.流形(英语:Manifolds)一般可以通过把许多平直的片折弯并粘连而成,是局部具有欧几里得空间性质的空间,是欧几里得空间中的曲线.曲面等概念的推广 2.描述一个流形往往需要不止一个“地图 ...

【CF840D】Destiny 分治(线段树)

[CF840D]Destiny 题意:给你一个长度为n的序列,q次询问,每次指定l r k,求[l,r]中出现次数$>\frac {r-l+1} k$的所有数中最小的那个数. $n,q\le 3 ...

double java 精度丢失_java中double和float精度丢失问题及解决方法相关推荐

  1. double operator[](int i)_java中double类型精度丢失问题及解决方法

    原文链接:https://blog.csdn.net/yacolspace/article/details/78287394 double类型数据加减操作精度丢失问题 今天在项目中用到double类型 ...

  2. java 获取星期几_java中获取日期是星期几的两种方法

    java中取得指定日期是星期几可以采用下面两种方式取得日期是星期几:(推荐:java视频教程) 1.使用Calendar类//根据日期取得星期几 public static String getWee ...

  3. java 数组参数_java中 数组可以作为形式参数传递到调用的方法中吗?要怎么操作?...

    展开全部 可以,操作代码如下: public class ArrTest{ public static void doTest(String[] args){ for(int i=0;i System ...

  4. java特殊类型_java中如何查找某个特定类型作为形参的方法

    import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; im ...

  5. java wait 参数_java中wait()和join()方法的区别是什么

    java中wait()和join()方法的区别是:存在不同的java包中:wait()方法用于线程间通信,它所施加的等待状态的线程可以被启动:join()方法用于在多个线程之间添加排序,它所施加的等待 ...

  6. java动态加载jar时,jar中还有第三方jar无法加载的解决方法

    java动态加载jar时,jar中还有第三方jar无法加载的解决方法 当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下 public static v ...

  7. 局域网中最常见的十大错误及解决方法

    局域网中最常见的十大错误及解决方法 网络故障是在所难免的,重要的是应快速隔离和排除故障.网络维护人员应该配备相应的工具和相应的知识,以便及时.有效的找到和解决问题.本文讨论了网络技术人员和工程师经常遇 ...

  8. linux vim m,关于linux中使用vim打开文件出现^M的解决方法

    在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件.我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致, 各 ...

  9. function()默认参数中ReferenceError Cannot access ‘a‘ before initialization的解决方法

    function()默认参数中ReferenceError: Cannot access 'a' before initialization的解决方法 代码 <!DOCTYPE html> ...

最新文章

  1. ICCV 2021| GRF: 用于三维表征和渲染的通用神经辐射场(已开源)
  2. at命令不生效 linux_帮你精通Linux:简约却不简单的ls命令
  3. mysql数据库优化大全_MySQL数据库优化技巧大全
  4. 程序包org.springframework.stereotype不存在,解决办法
  5. 云服务器mysql备份与还原数据库命令详解
  6. Android数据库 分页查询,Android之怎么使用SQLite数据库(增、删、改、查、分页等)以及ListView显示数据(转)...
  7. java super extends_Java继承和super的用法
  8. Hyper-V passes Microsoft’s checkmarks exam: isn’t that always the case?
  9. java param=json字符串_java解析json字符串
  10. system什么意思c语言,system是什么意思?
  11. IMX6Q获取序列号方法
  12. NUKE 11 for mac版(电影特效合成软件) 11.3v4激活版详细安装步骤
  13. 车牌识别算法实践(二):基础算法
  14. 我的后台Java面经(阿里、腾讯、头条、京东、IBM等)
  15. Rasterio入门
  16. Uboot11之主Makefile分析2
  17. oracle中文名转拼音,oracle 汉字转拼音
  18. sql--sqlsever--时间相关SQL语句--查询当前时间至前N天的数据
  19. 2021年全球与中国重型泥浆泵行业市场规模及发展前景分析
  20. 在行 app android,在行app安卓版

热门文章

  1. 有什么好用的监控员工电脑操作的软件?
  2. Android studio--Android开发添加外来字体库
  3. 计算机视觉领域较好论文汇总
  4. mysql alwayson_配置SQL Server 2012的AlwaysOn高性能组件
  5. 又是一年毕业季,分享自己在大学里的小打小闹经历
  6. 浙大PAT练习题1004
  7. WeGeek 微信小程序黑客马拉松主题公布!
  8. 解决NEC SV8100 内线分机拨打总机和专用话机自动接听的故障
  9. 新模式!chatGPT+Python爬虫接私单怎么玩?
  10. 软件生日提醒需求调研