double相加(減)结果会有些误差
2014-02-22 17:51
190 查看
前提介绍
今天在调试代码的时候发现了一个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类型进行计算
相关文章推荐
- double相加(減)结果会有些误差
- double相加(減)结果会有些误差
- double类型相加(減、乘、除)结果会有些误差
- 记录Java Double类型的数值相加/相减出现精度误差的问题
- java double相加精度误差
- 程序中两个Double类型相加出现误差的解决办法
- jave double相加结果误差+尾巴
- 【Java】Java处理double相加的结果异常
- double类型相减结果误差的解决办法
- 大数相加(两个数相加结果大于int能表示的范围时怎么办?)
- 折半查找实现算法二(递归办法)PS:编译后有一个warning,但不影响结果,代码设计上应该还有些问题
- 期待已久的中国移动开发者社区终于开张了,结果却令人有些失望
- 读取一个在0-99999之间的整数,将该整数的各位数字相加,如求和结果大于9,则继续对所获得的结果数字按各位相加求和,直至求出的和值小于10。
- double类型的精度问题【计算时有误差】。 (0.1 * 0.1 , 1.0 - 0.9)
- 求一个数个各位相加的结果时
- php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
- Java浮点数float和double精确计算的精度误差问题总结
- 正方形表格求行列相加所得结果
- JAVA中double类型运算结果异常的解决
- 用JAVA写一个函数,功能如下: 任意给定一组数, 找出任意数相加之后的结果为35(任意设定)的情况