c中怎样把一个扩大的浮点数真正变化为一个整数int,而不是在强制转换后还要继承float的精确度
最少币数【问题描述】题目:给定以元为单位的钱数,要求用100元、50元、20元、10元、5元、2元、1元、5角、2角、1角、5分、2分和1分面值的币来表示,要求币的总张(...
最少币数
【问题描述】
题目:给定以元为单位的钱数,要求用100元、50元、20元、10元、5元、2元、1元、5角、2角、1角、5分、2分和1分面值的币来表示,要求币的总张(枚)数最少,求各需要多少张(枚)。(1分-1000元)
我的疑问: 这个程序对大部分值是正确的,但当如输入x=74.43时,继而y=7443运算结果的fen数目是错误的;当简单修改程序直接令y=7443时结果是正确的。即问题在式子y=(int)(x*100);上怎么修改这个程序让他无误运行呢?
#include<stdio.h>
#include<stdlib.h>
int main()
{
float x;
int y,a10000,a5000,a2000,a1000,a500,a200,a100,a50,a20,a10,a5,a2,a1;
scanf("%f",&x);
y=(int)(x*100);
a10000=y/10000;
y=y-10000*a10000;
a5000=y/5000;
y=y-5000*a5000;
a2000=y/2000;
y=y-2000*a2000;
a1000=y/1000;
y=y-1000*a1000;
a500=y/500;
y=y-500*a500;
a200=y/200;
y=y-200*a200;
a100=y/100;
y=y-100*a100;
a50=y/50;
y=y-50*a50;
a20=y/20;
y=y-20*a20;
a10=y/10;
y=y-10*a10;
a5=y/5;
y=y-5*a5;
a2=y/2;
y=y-2*a2;
a1=y;
if(a10000>0) printf("100yuan:%d\n",a10000);
if(a5000>0) printf("50yuan:%d\n",a5000);
if(a2000>0) printf("20yuan:%d\n",a2000);
if(a1000>0) printf("10yuan:%d\n",a1000);
if(a500>0) printf("5yuan:%d\n",a500);
if(a200>0) printf("2yuan:%d\n",a200);
if(a100>0) printf("1yuan:%d\n",a100);
if(a50>0) printf("5jiao:%d\n",a50);
if(a20>0) printf("2jiao:%d\n",a20);
if(a10>0) printf("1jiao:%d\n",a10);
if(a5>0) printf("5fen:%d\n",a5);
if(a2>0) printf("2fen:%d\n",a2);
if(a1>0) printf("1fen:%d\n",a1);
system("pause");
return 0;
} 展开
【问题描述】
题目:给定以元为单位的钱数,要求用100元、50元、20元、10元、5元、2元、1元、5角、2角、1角、5分、2分和1分面值的币来表示,要求币的总张(枚)数最少,求各需要多少张(枚)。(1分-1000元)
我的疑问: 这个程序对大部分值是正确的,但当如输入x=74.43时,继而y=7443运算结果的fen数目是错误的;当简单修改程序直接令y=7443时结果是正确的。即问题在式子y=(int)(x*100);上怎么修改这个程序让他无误运行呢?
#include<stdio.h>
#include<stdlib.h>
int main()
{
float x;
int y,a10000,a5000,a2000,a1000,a500,a200,a100,a50,a20,a10,a5,a2,a1;
scanf("%f",&x);
y=(int)(x*100);
a10000=y/10000;
y=y-10000*a10000;
a5000=y/5000;
y=y-5000*a5000;
a2000=y/2000;
y=y-2000*a2000;
a1000=y/1000;
y=y-1000*a1000;
a500=y/500;
y=y-500*a500;
a200=y/200;
y=y-200*a200;
a100=y/100;
y=y-100*a100;
a50=y/50;
y=y-50*a50;
a20=y/20;
y=y-20*a20;
a10=y/10;
y=y-10*a10;
a5=y/5;
y=y-5*a5;
a2=y/2;
y=y-2*a2;
a1=y;
if(a10000>0) printf("100yuan:%d\n",a10000);
if(a5000>0) printf("50yuan:%d\n",a5000);
if(a2000>0) printf("20yuan:%d\n",a2000);
if(a1000>0) printf("10yuan:%d\n",a1000);
if(a500>0) printf("5yuan:%d\n",a500);
if(a200>0) printf("2yuan:%d\n",a200);
if(a100>0) printf("1yuan:%d\n",a100);
if(a50>0) printf("5jiao:%d\n",a50);
if(a20>0) printf("2jiao:%d\n",a20);
if(a10>0) printf("1jiao:%d\n",a10);
if(a5>0) printf("5fen:%d\n",a5);
if(a2>0) printf("2fen:%d\n",a2);
if(a1>0) printf("1fen:%d\n",a1);
system("pause");
return 0;
} 展开
2个回答
展开全部
首先,用VC6运行你的程序也是正确。
float浮点数的精度是小数点后6位之内都可以保证,所以你的问题不是float精度问题,因为不清楚你的错误结果是什么,无法猜测。
下面给你一个使用数组和循环的程序,在节省代码的同时,增加了两个安全处理:双精度和安全运算(这个在你的程序中同样适用,你可以修改试试)
#include<stdio.h>
#include<stdlib.h>
int main()
{
double x;//双精度
int y,i;
int a[13]={10000,5000,2000,1000,500,200,100,50,20,10,5,2,1};
int b[13];
scanf("%lf",&x);
x= x*100.0;
y=(int)x;//安全计算
for (i=0;i<13;i++)
{
b[i] = y/a[i];
y = y%a[i];//y - a[i]*b[i]
}
for (i=0;i<13;i++)
{
if(b[i]==0) continue;
if(a[i]<10)//fen
printf("%d fen: %d\n",a[i],b[i]);
else if(a[i]<100)//jiao
printf("%d jiao: %d\n",a[i]/10,b[i]);
else //yuan
printf("%d yuan: %d\n",a[i]/100,b[i]);
}
system("pause");
return 0;
}
追答
确实你的算法中使用float是存在这个问题,我检查了一下内存数据,7442.00在float存储中精度误差小数点后7为少了1,这样在强制转换后那个0.9999999就被舍去了。
安全处理方法上,用四舍五入代替强制转换会避免这个情况。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询