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)
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这些都是法律规定的.
您根本无法使用浮点值来表示货币,因为它们具有错误的属性.并非所有数字都可以完全表示,因此您将拥有"神秘"效果.
最好使用"定点"方法,最简单的方法是采用一个大的整数类型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)
请注意,这反过来限制了您可以代表的大笔金额.最终,您可能会发现需要一个任意精度的库来获得"无限制"的精度整数.