2

一連の while ループを使用して、総計でドルと硬貨の金額を数えようとしています。ただし、コインに取り掛かると、1ペニーオフになります。99.95 と入力すると、出力は 3 クォーター、1 ダイム、1 ニッケル、および 4 ペニーになります。問題を浮動小数点の精度の問題に絞り込みました。ただし、私が調査したすべてのソリューションは、私の状況には適用できませんでした。ポインタはありますか?

#include <iostream>
using namespace std;

int main()

{
   float amount;
   cout<<"enter amount" << endl;
   cin>>amount;
   int pennies=0, nickels=0, dimes=0, quarters=0, ones=0, fives=0, 
tens=0, 
twenties=0, fifties=0, hundreds=0;

   while (amount >= 100) 
   {
      hundreds = hundreds +1;
      amount = amount - 100;

   }
   while (amount >= 50)
   {
      fifties = fifties +1;
      amount = amount - 50;

   }
   while (amount >= 20)
   {
      twenties = twenties +1;
      amount = amount - 20;

   }
   while (amount >= 10)
   {
      tens = tens +1;
      amount = amount - 10;

   }
   while (amount >= 5)
   {
      fives = fives +1;
      amount = amount - 5;

   }
   while (amount >= 1)
   {
      ones = ones +1;
      amount = amount - 1;

   }
   while (amount >= .25)
   {
      quarters = quarters +1;
      amount = amount - .25;

   }
   while (amount >= .10)
   {
      dimes = dimes +1;
      amount = amount - .10;

   }
   while (amount >= .05)
   {
      nickels = nickels +1;
      amount = amount - .05;

   }
   while (amount >= .01)
   {
      pennies = pennies +1;
      amount = amount - .01;

   }


   cout<<endl<<"pennies:"<< pennies;
   cout<<endl<<"nickels:"<<nickels;
   cout<<endl<<"dimes:"<<dimes;
   cout<<endl<<"quarters:"<<quarters;
   cout<<endl<<"ones:"<<ones;
   cout<<endl<<"fives:"<<fives;
   cout<<endl<<"tens:"<<tens;
   cout<<endl<<"twenties:"<<twenties;
   cout<<endl<<"fifties:"<<fifties;
   cout<<endl<<"hundreds:"<<hundreds<<endl;







return 0;
}
4

4 に答える 4

3

正確な値が必要な場合は、浮動小数点を使用しないでください。99.95 は float または double で正確に表すことはできません。1/3 のようなビットは、有限数の通常の 10 進数を使用して正確に表すことはできません。

Doug T. が示唆したように、整数を使用してペニーの数を保持できます。ユーザーが 123.45 と入力すると、2 つの整数として読み取られ、123.45 ドルではなく 12345 ペニーとして格納されます。

この場合、最後while (amount >= .01)を のようなものに変更することもできますwhile (amount >= .005)。これは一般的に推奨できるソリューションではありません。これが実際の銀行のアプリケーションである場合は、避けるべきですが、少なくともいくつかのエラーを防ぐのに役立ちます。

于 2012-11-27T18:45:03.437 に答える
0

この場合、浮動小数点ではなく固定小数点値を使用する必要があります。

人々はお金をドルで考えていますが、これは正確ではありませんが、お金は正確なセントで測定されます。セント数を数え、100 で割ってドル額を取得し、法をとってセント額を取得します。この場合、浮動小数点は適切なツールではありません。

于 2012-11-27T18:50:32.703 に答える
0

これが修正されたコードです。TJD のアドバイスを使用し、.01 を使用する代わりに .0099 を使用しました。うまくいくように見える私の問題については、ありがとう!

    #include <iostream>
using namespace std;

int main()

{
   float amount;
   cout<<"enter amount" << endl;
   cin>>amount;
   int pennies=0, nickels=0, dimes=0, quarters=0, ones=0, fives=0, 
tens=0, 
twenties=0, fifties=0, hundreds=0;
   float p = .0099, n = .0499, d = .099, q = .2499;   
   while (amount >= 100) 
   {
      hundreds = hundreds +1;
      amount = amount - 100;

   }
   while (amount >= 50)
   {
      fifties = fifties +1;
      amount = amount - 50;

   }
   while (amount >= 20)
   {
      twenties = twenties +1;
      amount = amount - 20;

   }
   while (amount >= 10)
   {
      tens = tens +1;
      amount = amount - 10;

   }
   while (amount >= 5)
   {
      fives = fives +1;
      amount = amount - 5;

   }
   while (amount >= 1)
   {
      ones = ones +1;
      amount = amount - 1;

   }
   while (amount >= q)
   {
      quarters = quarters +1;
      amount = amount - q;

   }
   while (amount >= d)
   {
      dimes = dimes +1;
      amount = amount - d;

   }
   while (amount >= n)
   {
      nickels = nickels +1;
      amount = amount - n;

   }
   while (amount >= p)
   {
      pennies = pennies +1;
      amount = amount - p;

   }


   cout<<endl<<"pennies:"<< pennies;
   cout<<endl<<"nickels:"<<nickels;
   cout<<endl<<"dimes:"<<dimes;
   cout<<endl<<"quarters:"<<quarters;
   cout<<endl<<"ones:"<<ones;
   cout<<endl<<"fives:"<<fives;
   cout<<endl<<"tens:"<<tens;
   cout<<endl<<"twenties:"<<twenties;
   cout<<endl<<"fifties:"<<fifties;
   cout<<endl<<"hundreds:"<<hundreds<<endl;







return 0;
}
于 2012-11-27T19:05:14.217 に答える
0

一般に、2 進浮動小数点数は、10 進数の合計数が少ない場合でも、小数の 10 進数値を表すことができません。たとえば、0.1正確に表すことはできません。

正確な値を処理するために、異なるベースを使用することになるさまざまなアプローチが存在します2。特定のニーズに応じて、アプローチは多かれ少なかれ関与します。あなたの場合の最も簡単なアプローチは、可変精度の代わりに固定精度を使用することです。固定精度で計算するには、実際に の適切なべき乗を掛けた値を表す整数を使用します10。実行する計算量に応じて、ロジックをクラスにパッケージ化するか、コード全体に分散させることができます。「実際の」アプリケーションでは、それをクラスにパッケージ化し、課題 (宿題、面接など) では、ロジックを直接int.

于 2012-11-27T18:59:14.287 に答える