当前位置:  编程技术>.net/c#/asp.net

程序中两个Double类型相加出现误差的解决办法

    来源: 互联网  发布时间:2014-10-18

    本文导语:  今天在自己做的系统中,发现了一个奇怪的现象:几个Double类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱。以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里。最后干脆把计...

今天在自己做的系统中,发现了一个奇怪的现象:几个Double类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱。以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里。最后干脆把计算方法一句一句拆分,得到了最后最简单的一步,就是把两个具体的数值相加,但是最后的结果居然还是错误的。比如,现在已经到了最简单的一步:

代码如下:

double n = 171.6;
double m = 28.17;
double k = n + m;

  按理说k的值应该是199.77,但其实得到的居然是199.76999999999998。

     我们的系统里有保留小数位数为4位,按理是可以四舍五入成199.77的。但是因为有做金额的合计,是几十甚至几百个数据的相加,由于每两个数相加的时候都可能产生上述误差,因此最后得到的结果已经有了近0.7的误差,就算再四舍五入也于事无补了。

     上网查了一下相关资料,觉得CSDN论坛里的这个帖子的解释还是比较详细的:http://bbs.csdn.net/topics/300023952,大意是说由于运算的时候进行了进制的转换造成的(见8楼回复),所有的精度类型在几乎所有语言下都有这个问题。比较有效的解决办法是使用BigDecimal(见14楼回复),但是我个人认为那个BigDecimal的解决办法太麻烦了,至少对于我的系统来说是这样。还不如每加一次之后都进行一次字符串转换,保留有效的小数位数,比如,上述语句可以改写成:

代码如下:

double n = 171.6;
double m = 28.17;
//double k = n + m;
String kn = (n + m).ToString("N4");    //保留4位小数
double k = Convert.ToDouble(kn);

  也就是说,在String kn这一步,就已经把误差调整好了,得到的k值就是正确的了。这样每次相加都处理一下误差,无论要算多少个数据的合计也不用担心会出现误差过大的情况了。

    当然最好是把这种处理方法做成一个公用方法,专门用来处理两个数的相加。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 听说,初学JAVA有两个开源程序是必看的,请问是哪两个。在那里下载?
  • 运行了2个java程序,怎样区分两个程序?
  • 请问两个毫不相关的程序,怎样实现通信
  • 请问qt启用两个QThread线程可不可以运行不同的程序
  • 急!在LINUX上有什么工具可以测试两个程序的效率
  • 两个程序同时打开文件问题?
  • 关于两个网卡的网卡驱动程序编写的问题?
  • 怎么把两个程序加到自动启动里?
  • !!!急问: 两个程序,读取相同文件的问题??
  • 请问ncurses与curses有区别吗?有什么区别?在这两个库下编写的程序通用吗?
  • 看看这两个小程序
  • 有两个USB键盘怎么用自己写的USB键盘驱动程序只替换其中一个驱动?
  • 求一个很简单的脚本程序:删除一个文件中两个标志中的一段文字
  • 两个驱动程序能互相访问么?
  • 一个程序两个结果,请高手分析原因
  • linux下,要实现两个程序共享同一个串口,该怎么设置参数?谢谢
  • 如何实现本地的两个JAVA程序同时访问一个链表,从而共享数据资源,是否需要使用API
  • 这个socket程序的服务进程开始服务后,为什么总是两个进程?
  • 傻傻得问,如果两个设备共享一个中断线,中断响应程序怎么区分?
  • 自编译的helloworld程序不能同时在两个linux系统中执行????
  • 重装服务器后IIS网站错误(应用程序中的服务器错误)
  • 为什么我在java程序里启动的一个程序在java程序关闭后,该程序的所有进程都关掉了
  • windows server2008上PowerBuilder程序系统错误解决方法
  • Linux 编程怎么样在程序开启一个程序,和关闭一个程序?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • 程序员的八种级别,你属于哪一级?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 我的程序是用c写的gtk+程序,有个函数的参数要传给它图片的文件名,但是图片和原程序不在同一目录下怎么办?怎么在程序里指定文件的路径
  • 在docker容器中通过apt-get安装新的程序


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3