CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

浮点值计算出现小数点错误

楼主gong_hui2000(gong_hui2000)2005-10-29 09:41:50 在 .NET技术 / C# 提问

//相同精度下计算,  
  double   a,   b,   c,   d,   f;  
  a   =   0.38;  
  b   =   0.68;  
  c   =   8.38;  
  d   =   86.38;  
  f   =   100.0;  
   
  double   x   =   f   -   a   -   b   -   c   -   d;    
   
  我自以为是   x   =   4.18  
  结果却是   x   =   4.18000000000001  
   
  由于一些数据的小数点后位数会高达24位,如何避免这种精度误差  
   
  *在我的印象中,C++在相同的精度下计算,似乎不会出现这种问题。  
  问题点数:20、回复次数:10Top

1 楼jxufewbt(我的目标是5星)回复于 2005-10-29 09:50:29 得分 0

因为x是double型的啊Top

2 楼zhy0101(莠)回复于 2005-10-29 16:18:20 得分 5

如果真算到24位,不会有误差。Top

3 楼gong_hui2000(gong_hui2000)回复于 2005-11-02 09:35:49 得分 0

re   jxufewbt(我的目标是5星)   :  
    什么意思?   a,   b,   c,   d,   f,   x   同为double类型,相同精度的数据之间的计算,只要不超出精度范围,应该不会出现精度误差才对!  
     
    re   zhy0101(香蕉)   :  
    我希望在小数点后24位的范围内,不要出现精度误差!现在居然在2位的时候就已经出现了误差,让我感觉浮点类型计算不能获取到期望的值,不知道如何处理才能够避免这种情况的发生!Top

4 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-11-02 09:56:26 得分 0

在我的印象中,C++在相同的精度下计算,似乎不会出现这种问题。  
   
  100%记错  
   
   
  在C++中,浮点数极容易出现误差。C#还会智能优化一下避免一些误差。  
   
   
  只要是浮点数就会有精度损失,这是编程的常识问题,精确计算使用整型。浮点数永远是近似表达。  
   
  如果是精确计算,是必须使用整型的,近似计算才允许使用浮点数。  
   
   
   
  为什么浮点运算在图像处理方面很重要就是因为在图像处理方面的近似计算非常多。Top

5 楼shrinerain(圣影雨)回复于 2005-11-02 10:00:18 得分 5

楼主需要补习一下基础了Top

6 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-11-02 10:03:19 得分 0

不是从C语言过来的,或者C语言学的不透彻的都容易犯这个错误。  
   
  而这种错误非常危险,实在是值得引起足够的重视……Top

7 楼gong_hui2000(gong_hui2000)回复于 2005-11-16 09:20:30 得分 0

C里面是这么定义双精度实型(double):占用64位2进制,数据范围   (+/-)   10^((+/-)308)。数据按照整数和小数两部分保存,提供16位有效数字。  
   
  这里面的数字的位数范围仅仅为4~5位,还没有超出它的有效数字范围,所以理论上不应该出现位数误差。  
   
  既然大家都认为这里的精度误差是正常的现象,谁能解释一下!  
  Top

8 楼gong_hui2000(gong_hui2000)回复于 2005-11-16 09:37:43 得分 0

在老的   Turbo   C   2.0中测试,发现精度也没有出现问题  
  #include   <io.h>  
  void   main()  
  {  
  double   a,   b,   c,   d,   e,   f,   x;  
  a   =   0.38;  
  b   =   0.68;  
  c   =   8.38;  
  d   =   86.38;  
  f   =   100.0;  
  x   =   f   -   a   -   b   -   c   -   d   -   e;  
  sprintf("\nx=%f\n",   x);  
  }  
   
  结果为   4.180000  
   
  To:   Ivony()   (   )   ,   请解释一下!Top

9 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-11-16 09:47:13 得分 0

不论有没有超过精度范围都可能造成误差。  
   
  这个是不用解释的,因为浮点数没有保证在不超过精度的情况下就不会有误差。Top

10 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-11-16 09:49:08 得分 10

这牵涉到架构平台,甚至不同的CPU对浮点数的运算都不同,很难解释,但是有一点可以肯定,浮点数决不可用来做精确计算,浮点数的精度损失无法避免且无法被程序察觉。  
   
   
  你要做精确计算必须自己写结构,重载+-*/运算符即可。Top

相关问题

  • 在浮点计算时,如何决定小数点部分?谢谢
  • 小数点的keyvalue值
  • 计算函数,从数据库读取数值并计算百分数;同时,保留2位小数点?
  • 有没有取浮点数的小数点位数的函数??
  • BCB中如何限定浮点数小数点后的位数
  • 怎样将浮点数据小数点前面的0加上.
  • 浮点数怎么取小数点前两位?
  • 如何控制strtofloat所得浮点数小数点后的位数?
  • 对于A/B所得的浮点数怎样取小数点后2位
  • 救急!BCB中如何限定浮点数小数点后的倍数?

关键词

  • c++
  • 误差
  • 位数
  • 数据
  • 精度
  • 计算
  • 小数点
  • 浮点
  • 浮点数
  • 错误

得分解答快速导航

  • 帖主:gong_hui2000
  • zhy0101
  • shrinerain
  • Ivony

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo