C浮点变量不存储小数

时间:2013-01-05 22:09:53

标签: c input floating-point

我正在为一个班级创建一种收银机程序,它需要一个购买金额和一个投标金额,并给出剩余金额并将其分成每个账单的数量。问题是,当我尝试存储一个浮点数时,它不会将数字存储在该点的右侧。

这是我的代码:

int main(void)
{
    float purchase_amount = 0.00f,
        amount_tendered = 0.00f,
        calculated_return = 0.00f;
    float *p_return_amount;

    printf("Welcome to Change Counter!\n\n");

    printf("Please enter the total amount of purchase: ");
    scanf("%f", &purchase_amount);

    printf("\nPlease enter amount of money tendered: ");
    scanf("%f", &amount_tendered);

    // Debug output
    printf("\n\nPurchase Amount: %.2f\nAmount Tendered: %.2f ", purchase_amount, amount_tendered);

    calculated_return = amount_tendered - purchase_amount;
    p_return_amount = &calculated_return;

    printf("\n\nYour change is: %.2f", *p_return_amount);

    system("pause");
    return EXIT_SUCCESSFUL;
}

它只发生在非常大的数字上,这正是我正在使用的。比如14990300.54并说15000000.21只存储14990301.00和15000000.00。我出于某种原因自动完成了。

我的语法有问题吗?浮点太小了吗?

感谢。

3 个答案:

答案 0 :(得分:4)

类型float的大小和精度可能因系统而异,但通常为32位,只有大约7位小数,这与您所看到的一致。

更改为double类型(通常为64位,大约11位十进制数字)可能足以满足您的要求。

但请记住,浮点实际上将值存储在二进制中,而不是十进制。例如,值0.01不能完全以二进制分数的形式存储,只有1.0/3.0可以精确存储在十进制中。

在现实生活中,您可能不希望使用浮点进行涉及金钱的计算。一个好的选择是将所有金额存储为表示分数(或者您需要处理的最小金额)的整数,并根据需要在输入和输出上进行缩放。例如,32位有符号整数类型可以存储高达约2100万美元的金额; 64位有符号整数可以存储比您需要担心的更多钱(只要您不处理Zimbabwean dollars)。

一个简单的例子:假设您有long int值代表$ 123.45 12345。您可以将其打印为:

printf("%ld.%02d\n", value/100, value%100);

总是足够好。例如,如果您正在进行利息计算,则向123.45添加10%的利息会为您提供135.795,这不是一整数美分。据我所知,有法律明确规定银行和其他金融机构必须如何进行此类计算。我个人很少知道那些法律实际上说的是什么 - 以及你现在正在做什么,你可能也不需要。

另一方面,浮点数可能足以满足您当前的需求,即使您可以在这里和那里因为舍入错误而获得或失去一个虚假的便士。问问你的导师,并记住它 不足以进行真实的货币计算,至少在没有特别关注的情况下是这样。

我建议将Goldberg的"What Every Computer Scientist Should Know About Floating-Point Arithmetic"添加到您的某些事情列表中。对于你现在正在做的事情来说,它可能过于详细,但值得你留意。

答案 1 :(得分:2)

float仅存储7位有效数字。如果您想要更高精度,请改用doubledouble可存储16位有效数字。

有关浮点数的详细信息,另请参阅IEEE floating point

答案 2 :(得分:-1)

是的,浮点值在设计上是不精确的,而float将给出大约6位小数。

切勿将浮点值用于货币。使用整数,并使用适当的舍入规则。 (即按整数/分计算,并确保在分割数量时,保留总和。)