-2

以下のコードを検討してください。

#include <iostream>
using namespace std;

int main ()
{
  int a;
  double b;
  cout << "Enter a number to be divided by three" << endl;
  cin >> a;
  b = a / 3.0;
  cout << "The result of this is:" << b << endl;
  return 0;
}

小数点以下に格納する変数の数を設定するにはどうすればよいですか?これには、20桁以上が含まれます。

4

4 に答える 4

6

結果として得られる答えは。に1/3なるという印象を受けているようです0.33333333333...[to infinity]

それは正しくありません。浮動小数点数の精度は限られており、結果の値は、無限の桁数ではなく、約20桁程度になります。

変数bは、型の変数が処理できるすべての精度を持ちますdouble。それを制限する簡単な方法はありません。

ただし、表示する量だけを制限したい場合は、次のように表示される出力を制限できますcout

cout << fixed << setprecision(4) << b << endl;
  • fixed出力で固定小数点表記が使用されます(他のオプションはscientific)。

  • setprecision表示される最大桁数を制御します。

この場合の出力は次のようになります。

0.333

合計4桁(小数点以下1桁、小数点以下3桁)。

于 2013-02-06T15:46:37.110 に答える
1

数学では、1/3は無限の10進表現を持っています。コンピューターには、無限の表現はありません。1/3整数に除算すると、結果は整数になります。整数は小数部分を保持しないため、結果は0になります。代わりにdoubleを使用する1.0/3.0と、同じようなことが起こります。結果は、doubleに収まる数学結果の最良の近似値です。だからそれを恐れないでください。それを試してみてください。

于 2013-02-06T16:00:00.113 に答える
1

a/3 = bである必要がありますb = (double)a/3。そしてそれは一度だけ分裂します!そして、iamnotmaynardが言うように:あなたはaではなくbを印刷しなければなりません:cout << "The result of this is:"<< b << endl;

于 2013-02-06T15:46:04.583 に答える
1

doubleは固定サイズタイプです(ほとんどのシステムで8バイト)。したがって、特定の精度でのみ数値を格納します。「無限の除算」を恐れる必要はありません(1 / 3.0には有限の小数表現がないという意味で)。

編集(以下のコメントに基づく)

実際に任意精度の実数表現を探している場合は、Boost.Multiprecisionなどのライブラリを使用する必要があります。

于 2013-02-06T15:46:57.473 に答える