在没有printf的情况下限制c中的浮点精度
Restricting float precision in c without printf
我正在尝试创建代码来计算为用户提供正确零钱所需的最少硬币数量。
我写的代码几乎是正确的,但硬币的数量总是有一点偏差。我假设这是由于小数位递增的数字不精确造成的。
有没有办法把浮点数限制在小数点后两位?
例如:
如果我输入 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);
}
您可以将输入乘以 100 并摆脱浮点数问题。 (将美元输入更改为美分)
然后你可以使用%
运算符计算结果。
这是由于浮点类型的不精确性。您当前使用的价值可能略高于或略低于您认为拥有的价值。如果它恰好偏低,您最终会得到比预期更少的硬币。
例如,值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);
我正在尝试创建代码来计算为用户提供正确零钱所需的最少硬币数量。
我写的代码几乎是正确的,但硬币的数量总是有一点偏差。我假设这是由于小数位递增的数字不精确造成的。
有没有办法把浮点数限制在小数点后两位?
例如: 如果我输入 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);
}
您可以将输入乘以 100 并摆脱浮点数问题。 (将美元输入更改为美分)
然后你可以使用%
运算符计算结果。
这是由于浮点类型的不精确性。您当前使用的价值可能略高于或略低于您认为拥有的价值。如果它恰好偏低,您最终会得到比预期更少的硬币。
例如,值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);