首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个循环状态出了什么问题?

这个循环状态出了什么问题?
EN

Stack Overflow用户
提问于 2014-01-24 20:03:43
回答 5查看 254关注 0票数 5

查看此链接的输出(向下滚动以查看输出),找出我想要完成的任务

问题在于9-11线上的for循环。

代码语言:javascript
运行
复制
for(i=0; i<=0.9; i+=0.1){
  printf("%6.1f ",i);
}

我期望这个值从0.0到0.9之间,但是它在打印0.8之后就停止了,知道为什么吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-24 20:09:36

在这里使用浮点数是问题的根源。相反,使用int来实现它:

代码语言:javascript
运行
复制
int i;
for(i = 0; i <= 10; i++)
   printf("%6.1f ", (float)(i / 10.0));

输出:

代码语言:javascript
运行
复制
0.0    0.1    0.2    0.3    0.4    0.5    0.6    0.7    0.8    0.9    1.0 
票数 7
EN

Stack Overflow用户

发布于 2014-01-24 20:19:24

理想情况下,浮点不应用于迭代,但如果您想知道为什么要更改代码并查看如何更改代码。

代码语言:javascript
运行
复制
for(float i=0; i<=0.9f; ){
    i+=0.1f;
    System.out.println(i);
}

这是结果。

代码语言:javascript
运行
复制
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001

你的第九个数值超过0.9。

票数 4
EN

Stack Overflow用户

发布于 2014-01-24 20:20:11

浮点算法在计算中是不精确的。这是因为计算机表示浮点值的方式。以下是MSDN关于这一主题的文章的摘录:

每个十进制整数都可以精确地由二进制整数表示;但是,对于小数来说,这并不是>正确的。事实上,在基数小于10的任何系统中,基10中的每个非理性数也都是>非理性的。 特别是对于二进制,只有p/q形式的小数,>q是2的整数幂,才能用有限的位数精确表示。 即使是常见的十进制分数,如小数点0.0001,也不能精确地用>二进制表示。(0.0001是一个周期为104位的重复二进制分数!)

链接到全文:https://support.microsoft.com/kb/42980

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21341496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档