C - Float Imprecision,如何锁定计算的小数位?

C - Float Imprecision, How to lock the decimal places for calculations?

我正在编写一个小程序来测试 C 中的浮点数:程序本身很简单,我只是想根据用户的输入,return多少Dollar(s), Quarter(s)... etc,他的号码有。

//------------------------------> First Part: All the necessary Variables <-----------------------------
 
int main (void)
{
    //Getting the user Input
    float number = get_float("Number: ");
   
    //Checking if is a positive number
    if (number < 0)
    {
        printf("A positive number, Please: ");
    }

    //Declaring my Constant/Temporary variables.
    float coinValues[] = {1.00, 0.25, 0.10, 0.5, 0.01};
    char  *coinNames[] = {"Dollar(s): ", "Quarter(s): ", "Dime(s): ", "Nickel(s): ", "Penny(ies): "};
    int   i            = 0;
    int   tmp          = 0;
    
//-----------------------------------> Second Part: The code Itself <-----------------------------------

    //Checking/Printing the necessary coins.
    while (number > 0)
    {
        //Until the loop stops, check if the number can be divided by the CoinValue.
        if (number >= coinValues[i])
        {
            //Print the current Coin Name from the divided value.
            printf("%s", coinNames[i]);
            //Check if the Current Number still contains Coin Values inside of it, if True counts one in your "Coin Score".
            while (number >= coinValues[i])
            {
                number -= coinValues[i];
                tmp++;
            }
            //Print the Current "Coin Score", then resets TMP.
            printf("%i\n", tmp);
            tmp = 0;

        }
        else
        {   
            //Updating the Coin value
            i++;
        }

    }
    
}

只要我使用 Integers,我的程序就 运行 很好,但是当我将此代码转换为 Floats(Dime(s), Nickel(s), and Penny(ies)) 开始变为 return 非预期的 结果 Int变量tmp.

2.6 这样的数字的预期结果将是 2 美元 2 季度 和 1 Dime,但有时,程序不使用 Dime(s),而是跳过它们并使用 Nickel(s),然而,困扰我的是程序总是 returning AWL=+ 没有任何价值然后程序永远冻结。

考虑到我唯一的想法是我正在“遭受”Float Imprecision,而且我不知道如何解决它,所以任何人都可以帮助我吗?

Ps. 程序需要始终return 最大值 从每个 coin 传递前。

浮点运算旨在近似实数运算。 IEEE 754-2008 说“浮点运算是对实数运算的系统近似……”因此无法“锁定”二进制浮点数中的十进制数字。它旨在用于您想要 近似值的地方,例如建模物理。这甚至包括一些金融应用程序,例如期权评估。虽然浮点运算在某些情况下可以用于精确计算,但这些需要特别小心,通常只在特殊情况下才进行。

因此,对于您关于如何锁定小数位的问题,答案是没有用二进制浮点数来做到这一点的好方法。尝试这样做通常只会产生与整数运算相同的效果,但效率较低且代码更难。因此,使用整数运算并根据所需的最小货币单位(例如一分钱)缩放金额。