-2

次のようなファイルへの出力を取得しようとしています。

1.11111
11.1111
111.111
1111.11
111111

言い換えれば、精度ではなく、出力の重要性を設定しようとします。私はもう試した

oFile <<setprecision(6);

fprintf(oFile, "%6f", varName);

無駄に。

どんな助けでも大歓迎です。

乾杯

編集:不完全な質問で申し訳ありません。最小限、完全、かつ検証可能な例を次に示します。

#include<iostream>
#include<fstream>
#include<iomanip>

using namespace std;
int main() {
    ofstream oFile("output.dat");
    float var1 = 10.9993;
    float var2 = 11;
    oFile << var1 << endl;
    oFile << var2 << endl;
    oFile << std::setprecision(6) << var2 - var1 <<endl; //10.9993 - 11 = -0.000699997
    oFile.close();
    /* 
     * output
     * 10.9993
     * 11
     * 0.000699997
    */
    FILE * oFile2;
    oFile2 = fopen("output2.dat","w");
    fprintf(oFile2, "%6f \n%6f \n%6f \n",var1, var2, var2-var1);
    fclose(oFile2);
    /*
     * output
     * 10.999300 
     * 11.000000 
     * 0.000700 
    */
}

したがって、精度に関係なく、すべての場合で最大6桁の有効数字が必要です。つまり、次のようになります。

10.9993
11 or 11.0000 that does not matter
0.00070

わかりましたので、各変数を小数点から乗算し、減算して、小数点に戻しました。これはうまくいくようです。C++ で意味を設定する機能がないように見えるのはクレイジーです。

4

2 に答える 2

0

表示したい桁数より多い double 値を設定するコードと、必要なものを取得するための 2 つの手法を次に示します。

#include <iostream>
#include <iomanip>
#include <stdio.h>

int main(){
  double d[6] = { 1.1111123, 11.111123, 111.11123,
                  1111.1123, 11111.123, 111111.23 };

  for( int i = 0; i < 6; i++ ){
    std::cout << std::setprecision(6) << d[i] << std::endl;
  }

  for( int i = 0; i < 6; i++ ){
    char buf[20];
    sprintf( buf, "%6g", d[i] );
    std::cout << buf << std::endl;
  }
  {
    char buf[20];
    sprintf( buf, "%6g", d[1]-d[0] );
    std::cout << buf << std::endl;
  }
}

改善できますが、基本的な成分を示しています。

後で

d[0] = 10.9993;
d[1] = 11;
d[2] = d[1] - d[0];
for( int i = 0; i < 3; i++ ){
  std::cout << std::setprecision(6) << d[i] << std::endl;
}
std::cout << std::setprecision(6) << d[1]-d[0] << std::endl;

for( int i = 0; i < 3; i++ ){
  char buf[20];
  sprintf( buf, "%6g", d[i] );
  std::cout << buf << std::endl;
}

これにより、

10.9993
11
0.0007
0.0007
10.9993
    11
0.0007
0.0007
于 2014-04-22T15:22:13.543 に答える
0

これがあなたの求めたものかどうかは 100% わかりませんが、なんとか結果を得ることができました

1.11111
11.1111
111.111
1111.11
11111.1
111111

次のコードで:

double test=1.11111;
for(int j=0;j<6;j++)
{
    cout<<test<<endl;
    test*=10;
}

この場合、iomanip や精度の変更は必要ありません。

于 2014-04-22T15:07:29.990 に答える