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;
}
4

7 に答える 7

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

これは間違っています; "%d"整数にするか、より良いのは、変数の型を追加料金の 0.50 を表すものに変更することaccountです。floatお金のために(不正確な) s を使用することもお勧めしません。10.499999997あなたが意図したときに撤退したくありません10.5。使用する精度と丸めの規則について考える必要があります。私の知る限り、これらは両方とも法律または何かによって義務付けられています。

于 2012-01-16T21:22:07.240 に答える
5

間違ったプロパティを持っているため、浮動小数点値を使用して通貨を表すことはできません。すべての数値が正確に表現できるわけではないため、「神秘的な」効果が得られます。

「固定小数点」アプローチを使用することをお勧めします。最も簡単なのは、整数型などの大きな整数型を取り、それlongを整数で乗算することです。通常、必要なのがセント全体 (米国通貨の場合) だけの場合は 100 です。セントの端数が必要な場合は、1 セントの 1/100 までのすべての値を表すことができるように、10,000 などを掛けます。

このスキームでは、$1 は次のようになります。

long one_dollar = 1 * 10000;

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

long thirteen_cents = 13 * 100;

これにより、表現できる金額が制限されることに注意してください。最終的に、「無制限」の精度の整数を取得するには、任意精度のライブラリが必要になる場合があります。

于 2012-01-16T21:21:36.563 に答える
3

お金を扱うときはフロートを使用しないでください。セントを追跡するために整数型を使用し、出力時にそれをドルとセント (または任意の通貨) に変換します。

特に、 10 進数の 0.1には正確な浮動小数点表現がありません。代わりに、無限に繰り返されるバイナリ小数 (0.19999999999.... hex )として表されます。同様に、10 進数の 0.01は約 0.028F5C28F... hexです。

于 2012-01-16T21:21:40.173 に答える
1

人生を少し楽にしてください。「整数」をドルと考えるのではなく、「セント」と考えてください。浮動小数点数は必要ありません。

于 2012-01-16T21:22:14.757 に答える
1

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

ただし、コードにはもっと根本的な欠陥があります。正確な小数が必要な場合、特に金額を扱う場合は、数値を表すために浮動小数点変数を使用しないでください。つまり、アプリケーションで浮動小数点数を使用しない理由は、小数を正確に表現できないからです。すべての位置番号システムでは、いくつかの数は無限に繰り返されるシーケンスで表されます。例えば、

10 進法では、1/3 は 0.33 として表されます[3]

(無限に繰り返される一連の数字を示す角括弧)。同様に、2 進数では、表現するために 0 と 1 の無限のシーケンスを必要とする数値もあります。例えば、

バイナリシステムでは、1/10 は 0.000110011[0011]

レジスタとメモリ位置の長さは有限であるため、これは切り上げまたは切り捨てられ、0.1 よりわずかに大きいか小さい数値を表します。floatしたがって、正確な値 0.1 を aまたはに格納することはできませんdouble

詳細については、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」を参照してください。

たとえば、1 つの代替手段として、セントを表す整数変数を使用する方法があります。

于 2012-01-16T21:22:47.330 に答える
0

アカウントが整数であっても浮動小数点数 ( %2f) であるかのように表示する場合は、%d代わりに書式指定子を使用する必要があります。

于 2012-01-16T21:22:59.933 に答える