对在C中分配了舍入浮点值的int执行简单算术时的意外值

时间:2016-09-01 15:11:17

标签: c

试图解决这个问题的时间已经无处可寻。我不明白为什么镍的整数值如此之高?

请输入$ xx.xx格式的欠款:$ 10.73 1073 季度:42,余数:23 硬币:2,余数:3 镍币:4195856,余数:3 便士:3

#include <stdio.h>
#include <math.h>

int main ()
{

    float userinput;
    int cents, count, quarters, dimes, nickels, pennies, remainder;

    printf("Please enter amount of change owed in $xx.xx format: $");
    scanf("%f",&userinput);

    while ((userinput <= 0) || (userinput < 0.01))
    {
        printf("Please enter a value equal to or greater than $0.01: $");
        scanf("%f",&userinput);
    }

    cents = roundf(userinput * 100);
    printf("%d\n", cents);

    while ((cents / 25) >= 1) {

        quarters = cents / 25;
        remainder = cents % 25;
        break;
    }

    printf("Quarters: %d, remainder: %d\n", quarters, remainder);

    while ((remainder / 10) >= 1) {

        dimes = remainder / 10;
        remainder = remainder % 10;
        break;
    }

        printf("dimes: %d, remainder: %d\n", dimes, remainder);

    while ((remainder / 5) >= 1) {

        nickels = remainder / 5;
        remainder = remainder % 5;
        break;
    }

    printf("nickels: %d, remainder: %d\n", nickels, remainder);

    while ((remainder / 1) >= 1) {

        pennies = remainder / 1;
        break;
    }

    printf("pennies: %d\n", pennies);
}

3 个答案:

答案 0 :(得分:5)

您需要初始化变量。

while ((remainder / 5) >= 1) {   // If "(remainder / 5) >= 1" is false

    nickels = remainder / 5;     // nickles is never set
    remainder = remainder % 5;
    break;
}

printf("nickels: %d, remainder: %d\n", nickels, remainder);  // Use of uninitialized value -> UB

所以尽量做到:

int cents=0, count=0, quarters=0, dimes=0, nickels=0, pennies=0, remainder=0;

一般来说,我认为您应该使用if代替while

int nickels = 0;

....
....

if ((remainder / 5) >= 1) {

    nickels = remainder / 5;
    remainder = remainder % 5;
}

BTW:使用scanf时,请务必检查返回值。

答案 1 :(得分:2)

未明确初始化的自动变量不会自动初始化为零。

待办事项

int nickels = 0; // similary for other variables too.

否则你可能会得到garbage value - 提供的nickels未在途中设置 - 这可能非常高:)

答案 2 :(得分:0)

原因是您没有初始化变量“nickeles”。 所以“nickels”的初始值是范围超过int值。 “余数”也小于5,所以这个仪器跳过了。 所以“镍币”的价值仍然没有改变。 但是你将“nickels”的值打印到int类型。

printf("nickels: %d, remainder: %d\n", nickels, remainder);

所以“镍币”的价值是4195856。

如果您打印正确的“镍币”值,则必须初始化“镍币”的值。

int nickels = 0;

我建议您在编码时初始化c / c ++中的所有值。

我希望这会有所帮助。