| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1364 人关注过本帖
标题:[讨论]书本中问题
只看楼主 加入收藏
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
 问题点数:0 回复次数:16 
[讨论]书本中问题

请编一个函数float fun(double h),函数的功能是对变量h中的值保留2位小数,并对第三位进行四舍五入(规定h中的值为正数)。
例如:h值为8.32433,则函数返回8.32, h值8.32533,则函数返回8.33。
#include<stdio.h>
float fun(float h)
{ long t;
h*=1000;
t=(h+5)/10;
return(float)t/100;
}

void main()
{
float a;
printf("Enter a:");
scanf("%f",&a);
printf("The original data is:");
printf("%f\n\n",a);
printf("The result:%10.2f\n",fun(a));
}
算法不错,不过输入123456.123456,那么它显示123456.13,本人认为浮点范围所限制,即是机器问题,还有
把它程序变为这样:
#include<stdio.h>
float fun(float h)
{ long t;
h*=1000;
t=h+5;
return(float)t/1000;
}

void main()
{
float a;
printf("Enter a:");
scanf("%f",&a);
printf("The original data is:");
printf("%f\n\n",a);
printf("The result:%10.2f\n",fun(a));
}

如果输入0。122222,那么它输出0。13,为什么?

搜索更多相关主题的帖子: float 书本 printf 函数 
2006-09-28 10:38
C之Itachi
Rank: 1
等 级:新手上路
帖 子:111
专家分:0
注 册:2006-7-16
收藏
得分:0 

0.127当然输出0.13咯..float`


2006-09-28 11:08
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 

我问题是
#include<stdio.h>
float fun(float h)
{ long t;
h*=1000;
t=h+5;
return(float)t/1000;
}

void main()
{
float a;
printf("Enter a:");
scanf("%f",&a);
printf("The original data is:");
printf("%f\n\n",a);
printf("The result:%10.2f\n",fun(a));
}

如果输入0。122222,那么它输出0。13,为什么?


谁有强殖装甲第二部,可以Q我460054868
2006-09-28 12:52
ghj2021
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2006-4-21
收藏
得分:0 

算法也就应该是这样啊

2006-09-28 18:55
C之Itachi
Rank: 1
等 级:新手上路
帖 子:111
专家分:0
注 册:2006-7-16
收藏
得分:0 
t=(h+5)/10
这里t为long 也就是个位被甩掉的过程.
而return(float)t/1000 强制转换为float本身就要4舌5入..你输入
再(float)(0.122222*1000+5)/1000就相当于1227.22/1000当然结果为1.23咯

2006-09-28 19:24
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
有什么人解答这问题啊

谁有强殖装甲第二部,可以Q我460054868
2006-09-28 19:26
C之Itachi
Rank: 1
等 级:新手上路
帖 子:111
专家分:0
注 册:2006-7-16
收藏
得分:0 
...写错了``是127.322/1000结果4舌5入为0.13....

2006-09-28 19:26
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
我知道,这转换是吞这些位,但没有理由有进位。

谁有强殖装甲第二部,可以Q我460054868
2006-09-28 19:32
q3077965
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-9-20
收藏
得分:0 

其实程序完全正确,例如:
float i,k;
i=123456.123456;
k=123456.126543
printf("%10.2f\n",i);
printf{"%10.2f\n",k);
结果都是123456.12
printf语句没有四舍五入功能
同样类型转换语句也没有
那这里为什么就错了呢?
其实是这样的,float类型的数据有效数字最多只有7位,超过7位,就会出现舍入误差
如果一个数的有效数字小于7位,程序运行正确
大家不防试一下.
也就是1.123456用这个程序运行能得到1.12.


佛,你万世孤独,请容我一生寂寞.
2006-09-28 20:30
C之Itachi
Rank: 1
等 级:新手上路
帖 子:111
专家分:0
注 册:2006-7-16
收藏
得分:0 
#include <stdio.h>
main()
{
float i,k;
i=1.234;
k=1.236;
printf("%10.2f\n",i);
printf("%10.2f\n",k);
}

输出的是1.23
1.24
float i,k;
i=123456.123456;
k=123456.126543
printf("%10.2f\n",i);
printf{"%10.2f\n",k);
输出的是123456.12
123456.13 所以你说的那个7位很有道理 7位以内4S5R~我以为

2006-09-28 21:11
快速回复:[讨论]书本中问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012580 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved