0

私はクラス用の一種のレジプログラムを作成しています。それは購入金額と入札金額を取り、残りの金額を与え、それを各請求書の数に分割します。問題は、フロートを保存しようとすると、ポイントの右側に数字が保存されないことです。

これが私のコードです:

int main(void)
{
    float purchase_amount = 0.00f,
        amount_tendered = 0.00f,
        calculated_return = 0.00f;
    float *p_return_amount;

    printf("Welcome to Change Counter!\n\n");

    printf("Please enter the total amount of purchase: ");
    scanf("%f", &purchase_amount);

    printf("\nPlease enter amount of money tendered: ");
    scanf("%f", &amount_tendered);

    // Debug output
    printf("\n\nPurchase Amount: %.2f\nAmount Tendered: %.2f ", purchase_amount, amount_tendered);

    calculated_return = amount_tendered - purchase_amount;
    p_return_amount = &calculated_return;

    printf("\n\nYour change is: %.2f", *p_return_amount);

    system("pause");
    return EXIT_SUCCESSFUL;
}

それは私が扱っているものだけである本当に大きな数でのみ起こります。14990300.54と言い、15000000.21は14990301.00と15000000.00を格納するだけだと言います。なんらかの理由で自動的に切り上げます。

構文に問題がありますか?浮動小数点が小さすぎませんか?

ありがとう。

4

3 に答える 3

4

型のサイズと精度はfloatシステムによって異なる場合がありますが、通常は 32 ビットで、10 進数で約 7 桁しかなく、表示されているものと一致しています。

タイプdouble(通常は 64 ビットで 10 進数で約 11 桁) に変更するだけで十分です。

ただし、浮動小数点は実際には値を 10 進数ではなく 2 進数で格納することに注意してください。たとえば、値0.01を 2 進小数として正確に保存することはできず1.0/3.0、10 進数で正確に保存することもできません。

実生活では、おそらくお金に関する計算に浮動小数点を使用したくないでしょう。別の方法としては、すべての金額をセント数 (または処理する必要のある最小金額) を表す整数として格納し、必要に応じて入力と出力をスケーリングする方法があります。たとえば、32 ビットの符号付き整数型は、最大約 2,100 万ドルの金額を格納できます。64 ビット符号付き整数は、心配する必要があるよりも多くのお金を保管できます (ジンバブエドルを扱っていない限り)。

簡単な例: long int$123.45 を表す値があるとします12345。次のように印刷できます。

printf("%ld.%02d\n", value/100, value%100);

これは常に十分であるとは限りません。たとえば、利息の計算を行っている場合、 に 10% の利息を追加すると、123.45が得られますが135.795、これはセントの整数ではありません。銀行やその他の金融機関がそのような計算をどのように実行しなければならないかを正確に規定する法律があることを理解しています。個人的には、これらの法律が実際に何を言っているのかほとんどわかりません。あなたが今していることについては、おそらくその必要もありません。

一方、丸め誤差のためにあちこちで偽のペニーを獲得したり失ったりする可能性があるとしても、現在の目的には浮動小数点で十分である可能性があります。インストラクターに尋ねてください。少なくとも特別な注意がなければ、実際の金銭計算には十分ではないことを覚えておいてください。

Goldberg の「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」をいつか読むべきもののリストに追加することをお勧めします。あなたが今していることには詳細すぎるかもしれませんが、頭の片隅に置いておく価値はあります。

于 2013-01-05T22:15:22.943 に答える
2

float有効数字7桁のみを格納します。より精度が必要な場合は、double代わりに使用してください。double有効数字16桁を格納できます。

浮動小数点数の詳細については、IEEE浮動小数点も参照してください。

于 2013-01-05T22:13:04.123 に答える
-1

はい、浮動小数点値は設計上不正確であり、float小数点以下6桁程度になります。

通貨に浮動小数点値を使用しないでください。適切な丸め規則を使用して、整数を使用します。(つまり、ペニー/セント全体で数え、数量を分割するときに合計が保持されるようにします。)

于 2013-01-05T22:12:32.400 に答える