Ограничение точности с плавающей точкой в ​​c без printf - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь создать код, который рассчитывает минимальное количество монет, необходимое для предоставления пользователю правильного изменения.

Код, который я написал, почти верен, но количество монет всегда немного меньше. Я предполагаю, что это связано с неточностью чисел с увеличением десятичных знаков.

Есть ли в любом случае ограничить число с плавающей запятой до 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);
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Это связано с неточной природой типов с плавающей точкой. Значение, с которым вы сейчас работаете, может быть немного больше или чуть меньше значения, которое, по вашему мнению, у вас есть. Если это окажется с низкой стороны, вы получите меньше ожидаемых монет.

Например, значение 0.1 может фактически быть сохранено как 0.09999999. Таким образом, вы получите никель и четыре копейки вместо одного цента.

Умножьте полученное вами значение на 100, затем округлите его до ближайшего целого числа, затем работайте в центах. Если предположить, что это значение меньше 16 миллионов центов, это даст вам точное значение.

   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);
0 голосов
/ 01 ноября 2018

Вы можете умножить свой ввод на 100 и избавиться от проблемы с плавающей запятой. (изменить ввод доллара в цент)

И после этого вы можете использовать оператор % для вычисления результата.

...