当前位置: 代码迷 >> C# >> 为啥一个Double值这么怪
  详细解决方案

为啥一个Double值这么怪

热度:48   发布时间:2016-05-05 03:31:54.0
为什么一个Double值这么怪
一个Double值由2个Double相加,比如明明是91.2 + 2.4,结果应为93.6,为什么结果是93.6000000000001
为什么会无端地在小数点后面加很多个0,最后还是一个1 ?

------解决思路----------------------
http://blog.csdn.net/starfd/article/details/44623335
因为科学计数法,浮点数会有精度问题,上面链接做测试的时候用的是VS2013,居然相加没出精度问题,只有低级向高级转换时才有精度问题
但你这种两个同类型数据相加出现精度问题的其它版本碰到过,反正我也被搞得有点傻了
------解决思路----------------------

double x = 91.2;
double y = 2.4;
double z = x + y;
Console.WriteLine(z);
Console.ReadKey();

没发现这种现象。

double 存储 64 位浮点值的简单类型,根据计算机原理,神马高低位存储啥滴(都还给老师了),从这方面考虑,结合你的os分析分析。或者看下IL。
------解决思路----------------------
双精度浮点数,有效数字只有大概15位左右(具体多少位请查看msdn),剩下多出来的是计算机底层的处理执行时必然产生的误差。

计算机表示十进制数字都有误差的,这是很自然的事情。所以对于浮点数,你不能随便判断一个变量是否“等于93.6”,而应该用
    Math.abs(x - 93.6)<double.Epsilon 
这样的表达式来判断x是否是93.6。

这确实是在你学习计算机原理时应该学到的。
------解决思路----------------------
有两个误差,一个是二进制和十进制的转换误差,一个是浮点本身的精度误差。
------解决思路----------------------
引用:
有两个误差,一个是二进制和十进制的转换误差,一个是浮点本身的精度误差。

正解也,这是系统误差,是一些特殊的小数导致的。
详细看https://msdn.microsoft.com/zh-cn/library/system.double.aspx

------解决思路----------------------

感觉又涨姿势了
------解决思路----------------------
引用:
双精度浮点数,有效数字只有大概15位左右(具体多少位请查看msdn),剩下多出来的是计算机底层的处理执行时必然产生的误差。

计算机表示十进制数字都有误差的,这是很自然的事情。所以对于浮点数,你不能随便判断一个变量是否“等于93.6”,而应该用
    Math.abs(x - 93.6)<double.Epsilon 
这样的表达式来判断x是否是93.6。

这确实是在你学习计算机原理时应该学到的。

这个你说的就不全对了,如果是64位的计算机系统,就是另外一个数字了,有效数字说的不准确就不纠正了没这个必要。


------解决思路----------------------
引用:
http://blog.csdn.net/starfd/article/details/44623335
因为科学计数法,浮点数会有精度问题,上面链接做测试的时候用的是VS2013,居然相加没出精度问题,只有低级向高级转换时才有精度问题
但你这种两个同类型数据相加出现精度问题的其它版本碰到过,反正我也被搞得有点傻了

导致精度问题的根本愿意是在小数做位运算的时候,他的算法导致的。
再加上double本身长度就很短,所以有了decimal。
在64位的系统上不会有不准确的问题。
------解决思路----------------------
引用:
有两个误差,一个是二进制和十进制的转换误差,一个是浮点本身的精度误差。

正解啊。
------解决思路----------------------
<script>
document.write(91.2 + 2.4);
</script>
93.60000000000001
楼主是在浏览器做的实验,环境不同,自然结果也会有所不同
谁叫他用的是浮点数呢?

我觉的楼上有好几位都该恶补一下计算机基础知识中的 小数的二进制表示 和 浮点数 的相关章节
当然要再补习一下数理统计中的 有效数 这个概念就更好了
  相关解决方案