c++ double类型的赋值问题

chocolate001 2009-07-28 10:04:34
定义了两个double 类型的变量 x 和y。
double x;
double y;
x=1.8332999999999999;
y=1.8333;
if(x>=y)
cout<<"x>=y";
else
cout<<"x<y";
为什么结果是x>=y;
我通过vc++ 6.0调试发现 y的值在运行过程中变成1.8332999999999999,这是什么原因?
对double类型的变量赋值时要怎么做才能避免值的改变(如:y=1.8333 经编译变1.8332999999999999)?
怎样才能正确的比较两个double类型变量的大小?

大家帮忙看看。谢谢了!!
...全文
1721 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
s104892992 2009-07-28
  • 打赏
  • 举报
回复
或者你可以用string来保存数,这样比较就比较麻烦了 呵呵
amossavez 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chocolate001 的回复:]
那如果比较两个double类型数的大小,应该怎么比。
[/Quote]
判断相等的话要用精度来控制,就像二楼所说的那样!
liao05050075 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chocolate001 的回复:]
那么double类型的赋值,赋的值编译后为什么会变,怎么才能使它不变。
[/Quote]

因为浮点数的存储是不精确的,但通常这点误差是可以忽略不计的。你想让它一定不变,那是不可能的,除非你不用double,而使用类似高精度来存储它。
具体是为什么你可以搜索一下IEEE浮点数格式。
chocolate001 2009-07-28
  • 打赏
  • 举报
回复
用>=,和>来做应该一样,问题是调试时看到的y的值是1.8332999999999999而不是1.8333
  • 打赏
  • 举报
回复
别用>=,用>来做
chocolate001 2009-07-28
  • 打赏
  • 举报
回复
那么double类型的赋值,赋的值编译后为什么会变,怎么才能使它不变。
liao05050075 2009-07-28
  • 打赏
  • 举报
回复
因为浮点数的存储是不精确的,所以它不能像int一样直接用==来比较。
判断两个double相等,使用像fabs(a-b)<1e-6
比较两double的大小时,为防止本来是相等而错判,可以先判断是否相等,然后再用<或>号来比较
paulpeath 2009-07-28
  • 打赏
  • 举报
回复
浮点数确实不适宜大小比较,确要比较的话,请按if( fabs(a - b) < DBL_EPSILON)方法进行.
主要原因是:
系统按有效数字、指数保存浮点数。
float的有效位7位;
double有效位12位。
如在
有效范围内可进行比较。
beyond071 2009-07-28
  • 打赏
  • 举报
回复
如果只是比较大小,那用>, <都没问题,只是两个数据差距小于DBL_EPSILON时无法区分而已
如果是判断相等,那就用if( fabs(a - b) < DBL_EPSILON)
chocolate001 2009-07-28
  • 打赏
  • 举报
回复
那如果比较两个double类型数的大小,应该怎么比。
beyond071 2009-07-28
  • 打赏
  • 举报
回复
貌似没什么办法,float和double都会有这种存储精度的问题。
通常计算机是无法区分小到一定程度的差距的,就如同LZ遇到的情况。
通常认为两个double类型数据差距小于DBL_EPSILON,那么就认为它们相等
mengjfu 2009-07-28
  • 打赏
  • 举报
回复
用精度来判断
如abs(a-b)>0.000001则a==b
lori227 2009-07-28
  • 打赏
  • 举报
回复
double 判断大小不是类似int类型的等于, 判断精度很接近,就会认为两个数是相等的.
bfhtian 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 s104892992 的回复:]
或者你可以用string来保存数,这样比较就比较麻烦了 呵呵
[/Quote]
呵呵,确实很麻烦,还要比较整数部分,然后再比较字符串
niimp2 2009-07-28
  • 打赏
  • 举报
回复
浮点数很是个问题哦,学习中>..

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧