我不明白为什么下面的代码不能与值 4.2
正常工作。我使用调试器了解到 4.2
实际上并不是数字四点二;而是数字四点二。相反,浮点值 4.2 变为 4.19999981
为了弥补这一点,我刚刚在第 18 行添加了 change =change + 0.00001;
。
为什么我必须这样做?为什么浮点整数是这样工作的?
#include <stdio.h>
#include <cs50.h>
float change;
int coinTotal;
int main(void)
{
do {
// Prompting the user to give the change amount
printf("Enter change: ");
// Getting a float from the user
change = get_float();
}
while (change < 0);
change = change + 0.00001;
// Subtracting quarters from the change given
for (int i = 0; change >= 0.25; i++)
{
change = change - 0.25;
coinTotal++;
}
// Subtracting nickels from the remaining change
for(int i = 0; change >= 0.1; i++)
{
change = change - 0.1;
coinTotal++;
}
// Subtracting dimes from the remaining change
for(int i = 0; change >= 0.05; i++)
{
change = change - 0.05;
coinTotal++;
}
// Subtracting pennies from the remaining change
for(int i = 0; change >= 0.01; i++)
{
change = change - 0.01;
coinTotal++;
}
// Printing total coins used
printf("%i\n", coinTotal);
}
最佳答案
Typically float
可以准确地表示大约 232 个不同的值。对于 float
,4.2 不是其中之一。相反,正如 OP 报告的那样,该值大约 4.19999981。
使用零碎的钱是很棘手的。 float
很少是可以接受的货币类型。 This详细介绍了一些替代方案,例如基于 10 的 FP、double
、整数和自定义类型。
如果代码保留某些 FP 类型,change >= 0.1
以及其他比较,则需要更改为 change >= (0.01 - 0.005)
等。比较需要容忍小于或大于 0.01 倍数的值。
关于c - 与 C 中的浮点值略有混淆。 (cs50 pset1 gredy.c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45249574/