如何在不使用浮点的情况下乘以小数? [C17]

问题描述 投票:0回答:1

我正在尝试用 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)?
如果不是,我们在使用货币时如何处理此类问题?

重要提示:

  • 我对编程非常很陌生,所以如果这是一个非常简单的问题或措辞错误,请提前道歉。

  • 我使用结构来表示货币。当有用户输入时使用“Dinero”,并使用“Banka”来存储“实际值”。 int main 是小数点前的数字,int frac 是小数点前的数字。

    struct Currency{ int main; int frac; char symb[1]; Dinero,Banka;
    
    
  • 我知道即使是这个片段也可能写得不好,但请记住我是初学者:(

  • 如果我的问题有任何歧义,我很乐意澄清。

c floating-point integer currency
1个回答
0
投票
有没有办法在不使用浮点数的情况下将 RVmain 乘以小数(在本例中为 0.91)?

乘以 91,然后除以 100。

  1. 使用足够广泛的整数数学以避免溢出。

  2. 考虑您想要如何

    舍入结果。舍入到最近的,例如半程。还要考虑负美元金额。

示例:

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); }
    
© www.soinside.com 2019 - 2024. All rights reserved.