2012-01-16 117 views
3

我已經創建了一個類似ATM的程序,它將錢存在一個人的賬戶中。當該人取出提款時,它會扣除該賬戶的提款以及0.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; 
} 

回答

5

您完全不能使用浮點值來表示貨幣,因爲它們具有錯誤的屬性。並非所有的數字都可以完全代表,所以你會有「神祕」的影響。

最好使用「定點」方法,最簡單的方法是取一個較大的整數類型,如long,然後乘以一個整數,通常爲100,如果您只需要全部美分(對於美元)。如果您需要分數分數,請乘以比如10,000,以便能夠將所有值降至1/100:1分。

有了這個計劃,$ 1是:

long one_dollar = 1 * 10000; 

和13美分將是:

long thirteen_cents = 13 * 100; 

注意,這反過來又限制瞭如何大量的錢,你可以代表。最終,你可能會發現你需要一個任意精度庫來獲得「無限」精度整數。

+1

我希望通脹保持在足夠低的水平,在我整個一生中,64位就足夠了。 – 2012-01-16 21:27:04

3

,處理金錢時不要使用浮動。使用整數類型來跟蹤美分,然後將其轉換爲美元和美分(或任何貨幣)。

尤其是,0.1 十進制沒有精確的浮點表示形式。相反,它表示爲無盡的重複二分數(0.19999999999 .... 十六進制)。同樣,0.01 十進制大約是0.028F5C28F ... 十六進制

7
int account = 2000; 
printf("Remaining account: %.2f\n", account); 

這是錯誤的;它應該是整數或更好的"%d",將您的account變量類型更改爲可能代表您正在充電的0.50的值。我不建議你使用(不精確的)float。當你的意思是10.5時,你不想撤回10.499999997。你需要考慮你要使用的精度和舍入規則。 AFAIK這些都是由法律或其他東西強制。

1

讓您的生活變得輕鬆一點,而不是將您的「整數」看作美元,將它們視爲「美分」,那麼您將不需要浮點數。

1

您看到的警告是由於您將int傳遞給printf()並將%.2f作爲格式字符串的事實。此格式字符串將用於浮點數字。請參閱printf

但是,代碼中存在一個更基本的缺陷。當需要精確的小數部分時,您不應該使用浮點變量來表示數字,特別是在處理貨幣金額時。簡而言之,在您的應用程序中不使用浮點數的原因是小數不能完全表示。在每個位置數字系統中,一些數字由無限重複序列表示。例如,在十進制1/3

被表示爲0.33 [3]

(方括號指示的數字無限重複序列)。類似地,在二進制中,一些數字需要表示0和1的無限序列。例如,

二進制系統

,1/10是0.000110011 [0011]

由於寄存器和存儲器位置是在長度有限的,這是或向下舍入和表示略微高於或低於一個數0.1。因此,您不能在floatdouble中存儲0.1的確切值。

有關更多詳細信息,請參見What Every Computer Scientist Should Know About Floating-Point Arithmetic

一個替代方法是例如使用代表美分的整數變量。

0

打印賬戶,如果它是一個浮點數(%2f),即使它是一個整數,你應該使用%d格式說明,而不是

0

與金錢打交道時,你應該使用二進制編碼的十進制數。它將允許您爲美元和美分使用單個變量。當你處理它時,你可以指定一個typedef結構體聯合體,它允許你僅以美元,美分,全部美元和餘數來指定值。與其他貨幣交換不足,這對幾乎所有的貨幣情景都是有利的。