c - 与 C 中的浮点值略有混淆。 (cs50 pset1 gredy.c)

标签 c floating-point precision cs50 greedy

我不明白为什么下面的代码不能与值 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/

相关文章:

c - clock_gettime 和 CLOCK_PROCESS_CPUTIME_ID 的数字错误

c - 我不明白为什么 Person 类型不兼容?我需要做什么来编译它?

c - 在这种情况下, int x 的最小值和最大值是多少?

c - 如何找到以 GCC 开头的未闭括号?

c - 从c中的数组中删除字符串

floating-point - 为什么 float 不正确?

c - 浮点到字符串表示

java - N 数串接 N 次的模数

c# - 在 SQL Server 中保存时,是否可以保留 C# 十进制类型的原始尾随零?

C - 比较 float 和 if 语句