double转int的精度损失问题?

输入一个浮点数,因为要用到小数部分,所以我把double强转为了int类型,然后用原浮点数减去强转之后的int类型数得到了小数部分,把小数部分乘了100把它变为了整数以便后续使用。
其它一切良好,就是不知道结果中为什么小数部分的个位数计算出来的结果不对,比如图中的464.02,应该有两张0.1元的钞票,但是最后结果却只有一张,别的数关于个位也不对,于是我就用vstudio试了一下,提醒我强转可能会精度缺失,有人能讲一下原理吗,浮点数转化为整数不应该直接舍弃小数部分吗,怎么最后得到的小数钞票部分结果少1?

img

img

img

img

img

img


#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;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632