使用浮点数和整数

use*_*913 3 c floating-point integer floating-point-conversion

我已经创建了一个ATM程序,它将钱存入一个人的账户.当该人取出提款时,它会从账户中扣除50%的附加费.我遇到的问题是在这个程序中使用整数和浮点数.我将整数帐户转换为浮点数,但是当我尝试打印语句时收到错误消息.有人能告诉我我做错了什么吗?

#include <stdio.h>

int main (void) {
    int account = 2000;
    int withdrawal;
    float charge = 0.50;

    printf ("How much money would you like to take out? ");
    scanf ("%i", &withdrawal);

    while (withdrawal % 5 != 0) {
        printf ("Withdrawal must be divisible by 5. ");
        scanf("%i", &withdrawal);
    }

    account = ((float) account - charge) - withdrawal;

    printf("Remaining account: %.2f\n", account);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

jpa*_*cek 7

int account = 2000;
printf("Remaining account: %.2f\n", account);
Run Code Online (Sandbox Code Playgroud)

这是错的; 它应该是"%d"整数,或更好,将您的account变量类型更改为可能代表您正在充电的0.50.我不建议您使用(不精确)float的钱.10.499999997你的意思是你不想退出10.5.您需要考虑您使用的精度和舍入规则.AFAIK这些都是法律规定的.


unw*_*ind 5

您根本无法使用浮点值来表示货币,因为它们具有错误的属性.并非所有数字都可以完全表示,因此您将拥有"神秘"效果.

最好使用"定点"方法,最简单的方法是采用一个大的整数类型long,然后将它乘以一个整数,通常为100,如果你需要的只是整数美分(美元).如果你需要分数的分数,乘以更多,如10,000,以便能够代表所有值低至1/100:百分之一.

有了这个计划,$ 1将是:

long one_dollar = 1 * 10000;
Run Code Online (Sandbox Code Playgroud)

13美分将是:

long thirteen_cents = 13 * 100;
Run Code Online (Sandbox Code Playgroud)

请注意,这反过来限制了您可以代表的大笔金额.最终,您可能会发现需要一个任意精度的库来获得"无限制"的精度整数.