C浮点变量不存储十进制数

C浮点变量不存储十进制数,c,input,floating-point,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

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

这是我的密码:

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;
}
这只会发生在非常大的数字上,而这正是我正在研究的。假设1490300.54和15000000.21只存储1490301.00和15000000.00。出于某种原因,我会自动地进行取整

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


谢谢。

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


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

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


切勿对货币使用浮点值。使用整数,并使用适当的舍入规则。(即,以整便士/美分计算,并确保在划分数量时,总和保持不变。)

float
仅存储7个有效数字。如果需要更高的精度,请改用
double
double
可以存储16位有效数字


有关浮点数的更多详细信息,请参见。

float
仅存储7位有效数字。如果需要更高的精度,请改用
double
double
可以存储16位有效数字


有关浮点数的更多详细信息,请参见。

类型的大小和精度因系统而异,但通常为32位,只有大约7位十进制数字,这与您看到的一致

更改为“双精度”(通常为64位,约11位十进制数字)可能就足够了

但请记住,浮点实际上是以二进制而不是十进制存储值。例如,值
0.01
不能精确地存储为二进制小数,而
1.0/3.0
可以精确地存储为十进制

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

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

printf("%ld.%02d\n", value/100, value%100);
这并不总是足够好。例如,如果您正在进行利息计算,则将10%的利息添加到
123.45
会得到
135.795
,这不是整数。据我所知,有法律明确规定银行和其他金融机构必须如何进行此类计算。我个人几乎不知道这些法律到底说了些什么——而对于你现在所做的,你可能也不需要这样做

另一方面,浮点运算对于您当前的目的来说已经足够好了,即使您可能会因为舍入误差而在这里或那里获得或损失一个虚假的便士。问问你的导师,记住这对于真实世界的货币计算是不够的,至少如果不特别小心的话是不够的


我建议你把戈德堡的书加到你的书单上,以后再去读。对于你现在正在做的事情来说,它可能太详细了,但值得记住。

浮点类型的大小和精度可能因系统而异,但通常是32位,只有大约7位小数,这与你看到的一致

更改为“双精度”(通常为64位,约11位十进制数字)可能就足够了

但请记住,浮点实际上是以二进制而不是十进制存储值。例如,值
0.01
不能精确地存储为二进制小数,而
1.0/3.0
可以精确地存储为十进制

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

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

printf("%ld.%02d\n", value/100, value%100);
这并不总是足够好。例如,如果您正在进行利息计算,则将10%的利息添加到
123.45
会得到
135.795
,这不是整数。据我所知,有法律明确规定银行和其他金融机构必须如何进行此类计算。我个人几乎不知道这些法律到底说了些什么——而对于你现在所做的,你可能也不需要这样做

另一方面,浮点运算对于您当前的目的来说已经足够好了,即使您可能会因为舍入误差而在这里或那里获得或损失一个虚假的便士。问问你的导师,记住这对于真实世界的货币计算是不够的,至少在没有特别的c