2012-01-16 1 views
3

私は、人の口座にお金を貯める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; 
} 

答えて

5

不適切なプロパティを持つため、浮動小数点値を通貨として使用することはできません。すべての数値が正確に表現できるわけではありませんので、あなたは「不思議な」効果を持ちます。

「固定小数点」アプローチを使用する方がよい場合があります。longなどの大規模な整数型を使用し、それに整数(通常は100)を掛けるのが最も簡単です。 )。セントの分数が必要な場合は、10,000分の1を掛けて、すべての値を1分の1の1/100にすることができます。この方式では

、$ 1は次のようになります。

long one_dollar = 1 * 10000; 

そして13セントは次のようになります。

long thirteen_cents = 13 * 100; 

注このターンの制限にあなたは表すことができますどのように大規模なお金の量という。最終的に、「無制限」の高精度整数を得るために、任意の精度のライブラリが必要になることがあります。

+1

インフレ率が低くても、64ビットで十分です。 –

3

を入力してください。お金を扱う際に浮きを使用しないでください。 centsを追跡するために整数型を使用し、その値をドルとセントに変換します。

特に、0.1 の10進数には、正確な浮動小数点表現がありません。代わりに、それは無限の繰り返し二分画として表される(0.19999999999 .... hex)。同様に、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

あなたの人生を少し楽にし、あなたの "ints"をドルとして考えるより、 "セント"と考えると、浮動小数点数は必要ありません。

1

表示される警告は、フォーマット文字列として%.2fを指定してprintf()intを渡したことによるものです。このフォーマット文字列は、浮動小数点数に使用されます。 printfを参照してください。

しかし、コードには根本的な欠陥があります。正確な小数点以下の桁数が必要な場合、特に金額で作業する場合は、浮動小数点変数を使用して数値を表すべきではありません。要するに、アプリケーションで浮動小数点数を使用しない理由は、小数部分を正確に表すことができないためです。あらゆる位置番号システムにおいて、いくつかの数字は無限の反復配列によって表される。例えば、10進数で

1/3は0.33 [3]

(桁の無限に反復配列を示す角括弧)として表されます。同様に、バイナリでは、いくつかの数は0と1の無限列を表現する必要があります。例えば、これは切り上げまたはダウンやや上または下の数を表しているバイナリシステムで

、1/10レジスタおよびメモリ位置ので0.000110011 0011

では、長さが有限です0.1。したがって、floatまたはdoubleに正確な値0.1を格納することはできません。

詳細については、What Every Computer Scientist Should Know About Floating-Point Arithmeticを参照してください。

代わりに、セントを表す整数変数を使用することもできます。

0

それは整数であっても、あなたはお金を扱うときあなたはおそらく2進化10進数を使用する必要があります代わりに

0

%d書式指定子を使用する必要があります浮動小数点数(%2f)であったかのように、あなたはアカウントを印刷します。ドルとセントの両方に単一の変数を使用することができます。あなたがそれをしている間に、ドル、セント、ドルのみ、およびセントの残りの部分で値を指定できるtypedef構造体結合を指定することができます。他の通貨との交換が不十分で、それはほぼすべての通貨シナリオにとっては良いことです。

関連する問題