首页 > 解决方案 > 输入一些特殊数字时,“i”的值比应有的值小一

问题描述

我想解决这样一个问题:</p>

从键盘输入指定金额(以元为单位,如345.78),然后显示支付金额的各种面额的人民币金额,要求显示100元、50元、10元、5元、2元,1元,5角,1分,5分,各1分。像345.78=100*3+10*4+5*1+0.5*1+0.1*2+0.01*8

以下是代码:

#include<stdio.h>
int main()
{int a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0; 
float m;
printf("enter money:");
scanf("%f",&m);
while(m>100.0)
{m=m-100;
a1++;}
while(m>50.0)
{m=m-50;
a2++;}
while(m>10.0)
{m=m-10;
a3++;}
while(m>5.0)
{m=m-5;
a4++;}
while(m>2.0)
{m=m-2;
a5++;}
while(m>1.0)
{m=m-1;
a6++;}
while(m>0.1)
{m=m-0.1;
a7++;}
while(m>0.05)
{m=m-0.05;
a8++;}
while(m>0.01)
{m=m-0.01;
a9++;}
printf("a1=%d,a2=%d,a3=%d,a4=%d,a5=%d,a6=%d,a7=%d,a8=%d,a9=%d\n",a1,a2,a3,a4,a5,a6,a7,a8,a9);
return 0;
}

#include<stdio.h>

int main()
{
    double n,r[8];
    int k;
    scanf("n=%lf",&n);
    int a=n/100;
    r[0]=n-a*100;
    int b=r[0]/50;
    r[1]=r[0]-b*50;
    int c=r[1]/10;
    r[2]=r[1]-c*10;
    int d=r[2]/5;
    r[3]=r[2]-d*5;
    int e=r[3]/2;
    r[4]=r[3]-e*2;
    int f=r[4];
    r[5]=r[4]-f*1;
    int g=r[5]*10.00;
    r[6]=r[5]-g*0.1;
    int h=r[6]*20.00;
    r[7]=r[6]-h*0.05;
    int i=r[7]*100.00;
    printf("%d\n",a);
    printf("%d\n",b);
    printf("%d\n",c);
    printf("%d\n",d);
    printf("%d\n",e);
    printf("%d\n",f);
    printf("%d\n",g);
    printf("%d\n",h);
    printf("%d\n",i);
    return 0;
}

但是,在输入 0.78、0.98、0.99 等数字时,该值i总是少一。

这是怎么发生的?

标签: c++

解决方案


你应该避免浮点运算。将输入读取为浮点数并将最小单元的数量存储为整数:

#include <iostream>

int main()
{
    double input;
    std::cin >> input;
    int money = input * 100;
    for (auto n : {10000, 5000, 1000, 500, 200, 100, 10, 5, 1}) {
        std::cout << n / 100.0 << ":\t" << money / n << '\n';
        money %= n;
    }
    return 0;
}

输入:

1288.56

输出:

100:    12
50:     1
10:     3
5:      1
2:      1
1:      1
0.1:    5
0.05:   1
0.01:   1

推荐阅读