【问题标题】:Restricting float precision in c without printf在没有 printf 的情况下限制 c 中的浮点精度
【发布时间】:2018-11-01 19:23:09
【问题描述】:

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

我写的代码几乎是正确的,但硬币的数量总是有一点偏差。我假设这是由于小数位数增加的数字不精确。

有没有办法将浮点数限制为小数点后 2 位?

例如: 如果我输入 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);
}

【问题讨论】:

  • @user3121023 我会,但我的问题表要求我使用浮点数
  • 不是所有季度5美元的最低硬币数量吗?所以20-0-0-0?我不认为我理解这里的问题
  • @Bwebb 你是对的,应该是 20-0-0-0。我的错。
  • @KernelPource 是的,for 循环使用 应该没问题
  • @Bwebb 这是有道理的。谢谢!

标签: c loops cs50


【解决方案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);

【讨论】:

  • 谢谢,我刚刚试了一下,成功了!我假设这意味着如果我不使用 printf,就无法更改浮点数内的准确度?
  • @KernelPource printf 只是更改输出中的小数点数,但内存中的数字与以前相同。这是浮点变量的问题。
  • @MohammadAliTaqvazadeh 完美,感谢您的帮助!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2021-11-11
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多