我正在尝试用 c 语言编写一种 ATM 机代码。我被强烈建议在处理货币时不要使用浮点数。
在我的代码中,用户可以选择他们想要使用的货币($,E(欧元),P(英镑))。
当尝试从一种货币兑换为另一种货币时,就会出现问题,因为它们不能用 int 变量表示。
选择的汇率:
美国到欧盟是 0.91
美国到英国是 0.79
请注意,这些不是常量,用户可以更改它们。
代码片段:
#include <stdio.h>
#include <math.h>
#include <string.h>
struct Currency{
int main;
int frac;
char symb[1];
}Dinero,Banka;
struct Currency Dinero = {
0,0,"E" //E is €
};
struct Currency Banka = {
0,0,"$"
};
int UStoEU_ExchangeRate=91/100,UStoUK_ExchangeRate=79/100; //Exchange rates
int EU_US_ExchangeRate=110/100,UK_US_ExchangeRate=127/100;
int CalcCuentmain(){ //Function that takes the value from "Banka"(always in $) and translates them into the different currencies the user asked.
int RVmain; //Is used in int main() to print the RealValue times the exchangerate.
if (strcmp(Dinero.symb, "$")==0){
RVmain = Banka.main;
return RVmain;
}
if (strcmp(Dinero.symb,"E")==0){
RVmain = US_EU_ExchangeRate*Banka.main; //Doesn't Work
return RVmain;
}
if (strcmp(Dinero.symb,"P")==0){
RVmain = US_UK_ExchangeRate*Banka.main; //Doesn't Work
return RVmain;
}
}
int main(){...}
从代码中,行:
RVmain = US_EU_ExchangeRate*Banka.main; //Doesn't Work
这不会改变“RVmain”的值,因为“US_EUExchangeRate”四舍五入为 1。
有没有办法在不使用浮点数的情况下将 RVmain 乘以小数(在本例中为 0.91)?
如果不是,我们在使用货币时如何处理此类问题?
重要提示:
我对编程非常很陌生,所以如果这是一个非常简单的问题或措辞错误,请提前道歉。
struct Currency{
int main;
int frac;
char symb[1];
Dinero,Banka;
有没有办法在不使用浮点数的情况下将 RVmain 乘以小数(在本例中为 0.91)?乘以 91,然后除以 100。
舍入结果。舍入到最近的,例如半程。还要考虑负美元金额。
int US_EU_ExchangeRate_numerator = 91;
int US_EU_ExchangeRate_denominator = 100;
long long t = (long long)US_EU_ExchangeRate_numerator * Banka.main;
if (t >= 0) {
RVmain = (int) ((t + US_EU_ExchangeRate_denominator/2)/US_EU_ExchangeRate_denominator);
} else {
RVmain = (int) ((t - US_EU_ExchangeRate_denominator/2)/US_EU_ExchangeRate_denominator);
}