在没有printf的情况下限制c中的浮点精度

时间:2018-11-01 19:23:10

标签: c loops cs50

我正在尝试创建代码,以计算为用户提供正确零钱所需的最小硬币数量。

我写的代码几乎是正确的,但是硬币的数量总是很少。我认为这是由于小数位数增加而导致的数字不精确。

总有办法将浮点数限制为两位小数吗?

例如: 如果输入5,将得出19 * 25美分,2 * 10美分,0 * 5美分和4 * 1美分。

但是正确的数量应该分别为20-0-0-0。

#include <stdio.h>
#include <cs50.h>

//Assume that the only coins available are quarters (25¢), dimes (10¢), nickels (5¢), and pennies (1¢)

int main(){

float change;
float newTotal;
int coin25 = 0;
int coin10 = 0;
int coin5 = 0;
int coin1 = 0;

    do{
        change = get_float("How much change is owed: $ ");
    }
    while (change <= 0);

   for (float i = 0.25; i < change; i += 0.25){

       coin25 += 1;
   }
   newTotal = change - (coin25 * 0.25);

   for (float j = 0.1; j < newTotal; j += 0.1){

       coin10 += 1;
   }
   newTotal = newTotal - (coin10 * 0.1);

   for (float k = 0.05; k < newTotal; k += 0.05){

       coin5 += 1;
   }
   newTotal = newTotal - (coin5 * 0.05);

   for (float l = 0.01; l < newTotal; l += 0.01){

       coin1 += 1;
   }
   newTotal = newTotal - (coin1 * 0.01);

   //int coins = coin25 + coin10 + coin5 + coin1;
   //printf("%i\n", coins);

   printf("%i\n", coin25);
   printf("%i\n", coin10);
   printf("%i\n", coin5);
   printf("%i\n", coin1);
}

2 个答案:

答案 0 :(得分:1)

这是由于浮点类型的不精确性质。您当前使用的价值可能会比您认为的价值稍高或略低。如果它恰好位于低端,您最终将获得比预期更少的硬币。

例如,值0.1实际上可以存储为0.09999999。这样一来,您最终只能得到一分钱,而不是一角钱。

将您获得的值乘以100,然后将其四舍五入为最接近的整数,然后以美分计算。假设该值小于1600万美分,那么您将获得一个准确的值。

   newTotal = round(change * 100);

   for (int i = 25; i < newTotal ; i += 25){

       coin25 += 1;
   }
   newTotal = change - (coin25 * 25);

   for (int j = 10; j < newTotal; j += 10){

       coin10 += 1;
   }
   newTotal = newTotal - (coin10 * 10);

   for (int k = 5; k < newTotal; k += 5){

       coin5 += 1;
   }
   newTotal = newTotal - (coin5 * 5);

   for (int l = 1; l < newTotal; l += 1){

       coin1 += 1;
   }
   newTotal = newTotal - (coin1 * 1);

答案 1 :(得分:0)

您可以将输入乘以100来摆脱浮点问题。 (将美元输入更改为美分)

然后,您可以使用%运算符来计算结果。