double相加(減)结果会有些误差

原文:double相加(減)结果会有些误差

 

前提介绍

      今天在调试代码的时候发现了一个double类型数据相减的有趣问题,148163.1 - 82692.09大家猜猜结果等于多少,经过调试最终为5471.010000000009。

是不是很奇怪,下面将说明这其中的奥妙!

原因说明

     double属于floating binary point types,也就是说都double型的数值在相加减的时候,会将数值转换成二进制的数值如10001.10010110011这种表示发再做相加减,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,这就是造成微差距的主要原因。

解决方法

1.只取需要用到的位数:

 小数点台后面的位数部分就不要管了,不过这种方法不太好。

 2.使用Decimal类型:

 用Decimal就不会出现上面的问题了,可以准确的计算小数值,知识Decimal的范围比double小,一般情况下也够用了

 Decimal类型的有效位数达到28位,而double类型的16位,所以Decimal类型比Double类型能表示更精确的浮点数。相关知识可以参考下面的链接。

 c#中decimal ,double,float

总结

1.在double类型数值进行比较大小的情况最好使用1.02-1.01==double.MinValue这种方式进行判断

2.使用double类型进行加减的情况下看看能否使用Decimal类型进行计算

 

时间: 2024-09-20 19:20:05

double相加(減)结果会有些误差的相关文章

java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)

 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1. 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情. 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错.  首先贴一个使用的代码: /** * 将double类型数据转为字符串(如将18.4转为1840,如果需要1840.0,把int强转去掉即可) * @par

excel求和产生误差怎么办

Excel是电脑办公软件中最常用的软件之一.Excel数据库是很方便的一个工具.在用Excel进行有关数据汇总时,往往会出现误差,即自动求和结果比实际手工求和的结果大.出现这个情况是什么导致的要如何解决呢? 在财务工资表中,涉及到"工资税金"的计算问题,笔者依照"工资税金"的计算方法,制定出Excel的计算公式,根据每个职工的收入项进行相关 的计算后,将运算结果自动填入到每个职工的"税金"单元格内.但在进行"税金栏目"纵向汇总

Excel求和产生误差的解决办法

  Excel是做财务报表少不了的帮手,不过偶尔要做精确的数据文件时,突然发现Excel出现误差那么该怎么解决?在财务工资表中,涉及到"工资税金"的计算问题,笔者依照"工资税金"的计算方法,制定出Excel的计算公式,根据每个职工的收入项进行相关的计算后,将运算结果自动填入到每个职工的"税金"单元格内.但在进行"税金栏目"纵向汇总求和时,却发现自动求和的结果比手工实际求和的结果多几分钱. Excel表格 经过分析发现,在用Ex

excel求和产生误差怎么解决

  在财务工资表中,涉及到"工资税金"的计算问题,笔者依照"工资税金"的计算方法,制定出Excel的计算公式,根据每个职工的收入项进行相关的计算后,将运算结果自动填入到每个职工的"税金"单元格内.但在进行"税金栏目"纵向汇总求和时,却发现自动求和的结果比手工实际求和的结果多几分钱. 经过分析发现,在用Excel求和计算时(尤其是含有小数位的数据),一般会在单元格的"格式属性"中设置保留两位小数,而Excel

android微信支付问题总结

首先我们先看一个android微信支付时遇到的一个错误提示: onPayFinish, errCode = -1  当你参数签名都没有问题的时候,出现这个提示,请按照如下操作: 在你的项目测试android微信的组件(微信分享.微信支付等)的时候,一定要用你自己的keystore签名出来测试,如果用debug.keystore肯定是不成功的! 本文部分内容转自:http://blog.csdn.net/baidu_17508977/article/details/44517283 1,在微信开放

用户研究:带有求和性质的多选题如何进行深入分析

文章描述:调研问卷中多选题的分析方法探讨. 引子         使用调研问卷的定量研究中,为了更全面地了解研究内容.更广泛地收集信息,经常会用到多选题,但由于多选题多指向性的特点,除了频数表和交叉表(只能与单选题做交叉),较少用到其他的分析方法,损失了很多有用的信息.其实,如果调研时能善用多选题,并在分析时选取适当的方法,就能够充分利用多选题包含的信息,得到更有价值的结论.         上一篇文章谈到调研问卷中带有分类性质的多选题如何进行分析,本文将侧重说一下带有求和性质的多选题如何进行深

我的Android进阶之旅------>【强力推荐】Android开源图表库XCL-Charts版本发布及展示页

         因为要做图表相关的应用,后来百度发现了一个很好的Android开源图表库(XCL-Charts is a free charting library for Android platform.)                      下面内容转载于:http://blog.csdn.net/xcl168/article/details/29675613,详细介绍了XCL-Charts的展示内容.   =====================================

(一〇六)函数模板

函数模板的意义在于,可以在不同的参数下,起到同样的作用. 按照教程所说,它们使用泛型来定义函数,其中泛型可用具体的类型(如int.double)替换.通过将类型作为参数传递给模板,可使编译器生成该类型的函数.   由于模板允许以泛型(而不是具体的类型)的方式编写程序,因此在有时也会被称为是通用编程.   由于类型是用参数表示的,因此模板特性有时也被称为参数化类型.   格式: template <typename xx> void 函数名(xx &a, xx &b) { xx

既然float不能表示所有的int,那为什么在类型转换时C++将int转换成float?

既然float不能表示所有的int,那为什么在类型转换时C++将int转换成float? 问题: 代码如下: int i = 23; float f = 3.14; if (i == f) // 执行某段代码 编译器会将i转换成float类型,然后比较这两个float的大小,但是float能够表示所有的int吗?为什么没有将int和float转换成double类型进行比较呢? 回答: 在整型数的演变中,当int变成unsigned时,会丢掉负数部分(有趣的是,这样的话,0u < -1就是对的了)