输入一个浮点数,因为要用到小数部分,所以我把double强转为了int类型,然后用原浮点数减去强转之后的int类型数得到了小数部分,把小数部分乘了100把它变为了整数以便后续使用。
其它一切良好,就是不知道结果中为什么小数部分的个位数计算出来的结果不对,比如图中的464.02,应该有两张0.1元的钞票,但是最后结果却只有一张,别的数关于个位也不对,于是我就用vstudio试了一下,提醒我强转可能会精度缺失,有人能讲一下原理吗,浮点数转化为整数不应该直接舍弃小数部分吗,怎么最后得到的小数钞票部分结果少1?
#include
#include
using namespace std;
int main(){
double n;
int n1;
scanf("%lf",&n);
printf("NOTAS:\n");
n1=(n-(int)n)*100;
printf("%d nota(s) de R$ 100.00\n",(int)n/100);
n=(int)n%100;
printf("%d nota(s) de R$ 50.00\n",(int)n/50);
n=(int)n%50;
printf("%d nota(s) de R$ 20.00\n",(int)n/20);
n=(int)n%20;
printf("%d nota(s) de R$ 10.00\n",(int)n/10);
n=(int)n%10;
printf("%d nota(s) de R$ 5.00\n",(int)n/5);
n=(int)n%5;
printf("%d nota(s) de R$ 2.00\n",(int)n/2);
n=(int)n%2;
printf("MOEDAS:\n");
printf("%d moeda(s) de R$ 1.00\n",(int)n);
printf("%d moeda(s) de R$ 0.50\n",n1/50);
n1=n1%50;
printf("%d moeda(s) de R$ 0.25\n",n1/25);
n1=n1%25;
printf("%d moeda(s) de R$ 0.10\n",n1/10);
n1=n1%10;
printf("%d moeda(s) de R$ 0.05\n",n1/5);
n1=n1%5;
printf("%d moeda(s) de R$ 0.01\n",n1/1);
}
嗨,你好。
如果你可以使用gdb 调试的话,这个问题,你看看内存就明白了。
因为double 的数,例如0.25,在内存中只能是个近似值,而不是精确值,0.25 在内存中可能是0.2499999,当你去两位去乘以100,有可能是0.24;
怎么做才可以呢?如果你想要保留两位,那么加上0.005 之后乘以100,就可以啦。。
详细可以看下:
因为你强行转化成int后,小叔不会回被忽略,然后有那个原来的数减去转换后的数,后面的小数会变成这样,
eg:
412.36-412=0.36999999999999
这个解决办法就是你在头文件中要加入一个库,利用保留几位小数点的方式解决掉。
十进制分数的意思就是把1分为10份,取其1份。二进制小数,就是把1分为2份,取其1份,二者必然不能准确互转。所以转换会有误差。
你这到题需要按分计算,不要按元计算
修改如下,供参考:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double n3, n2;
int n1, n;
scanf("%lf", &n3);
printf("NOTAS:\n");
n = (int)n3;
n2 = (n3 - n) * 100;
n1 = (int)(round(n2));//修改
printf("%d nota(s) de R$ 100.00\n", (int)n / 100);
n = (int)n % 100;
printf("%d nota(s) de R$ 50.00\n", (int)n / 50);
n = (int)n % 50;
printf("%d nota(s) de R$ 20.00\n", (int)n / 20);
n = (int)n % 20;
printf("%d nota(s) de R$ 10.00\n", (int)n / 10);
n = (int)n % 10;
printf("%d nota(s) de R$ 5.00\n", (int)n / 5);
n = (int)n % 5;
printf("%d nota(s) de R$ 2.00\n", (int)n / 2);
n = (int)n % 2;
printf("MOEDAS:\n");
printf("%d moeda(s) de R$ 1.00\n", (int)n);
printf("%d moeda(s) de R$ 0.50\n", n1 / 50);
n1 = n1 % 50;
printf("%d moeda(s) de R$ 0.25\n", n1 / 25);
n1 = n1 % 25;
printf("%d moeda(s) de R$ 0.10\n", n1 / 10);
n1 = n1 % 10;
printf("%d moeda(s) de R$ 0.05\n", n1 / 5);
n1 = n1 % 5;
printf("%d moeda(s) de R$ 0.01\n", n1 / 1);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!