-1

次の2つの関数では、*コメントのある行に焦点を当てています。cout <<ステートメントが実行されると、小数点以下の桁数は表示されません。3021680380/10000000は302.1680ではなく302になります。

void convert(){
    setprecision(4);   //************************
    newFileTime = new double[numRec];   //***********
    newOffset = new int[numRec];
    newSize = new int[numRec];
    newNum = new int[numRec];
    newType = new int[numRec];
    newTime = new int[numRec];

    for(int i = 0; i<numRec; i++){
        newFileTime[i] = fileTime[i] / 10000000; //**********
        newOffset[i] = offset[i] / 512;
        newSize[i] = fileSize[i] / 512;
        newNum[i] = 0;
        if(type[i] == "Write"){
            newType[i] = 0;
        }else{
            newType[i] = 1;
        }
        newTime[i] = responseTime[i] / 10000000;
    }
}

void exports(){
    setprecision(4);  //**************
    ofstream fout;
    fout.open("prxy_0.ascii");
    {
    if(!fout){
            cout <<"File opening failed. \n";
        }
    }
    fout<< numRec <<endl;

    for(int i = 0; i < numRec; i++){
        fout<< newFileTime[i] << " " << newNum[i] << " " << newOffset[i] << " " << newSize[i] << " " << newType[i] << " " << newTime[i];
        cout<< fileTime[i] << " " << newFileTime[i] <<endl; //**********
        if(i != numRec - 1){
            fout<<endl;
        }
    }
    fout.close();
}

何か案は?

4

2 に答える 2

5

2 つの整数を除算すると、この式の結果も整数になります。整数除算は常に切り捨てられます。

    newFileTime[i] = fileTime[i] / 10000000;
    //               ^^^^^^^^^^^   ^^^^^^^^
    //                   int          int

式を修正するには、オペランドの 1 つを a にキャストdoubleして、除算を浮動小数点除算にします (次のいずれかの方法を使用します)。

    newFileTime[i] = static_cast<double>(fileTime[i]) / 10000000;
    // or
    newFileTime[i] = fileTime[i] / 10000000.0;

std::setprecision(...)精度を設定するには、精度を設定したいストリームにの呼び出しを入れる必要があることに注意してください。また、これは計算の実行方法ではなく、出力精度のみを設定します (ストリームへの書き込み時)。

    std::cout << std::setprecision(4) << [some double values]

std::setprecisionまた、小数点以下の桁数ではなく、拡大桁数を設定することに注意してください。したがって、あなたは(4つの有効数字)302.1680として印刷されます。小数点以下302.2の固定桁数を設定するには、ストリームの前または後に書き込みます。std::fixedstd::setprecision

    std::cout << std::fixed << std::setprecision(4) << [some double values]

このような構成は、再度変更するまで、プログラムの実行中に保持されることに注意してください。それらを関数内でローカルに保持するには、完了後に必ず構成を復元してください。

もちろん、std::coutこれは単なる模範的な流れでした。std::ostream同じことがファイル (任意のオブジェクト)への書き込みにも当てはまります。

于 2013-01-31T19:03:21.223 に答える
2

あなたが求めたものとはまったく異なります(すでに回答されています)が、これは:

newFileTime = new double[numRec];   //***********
newOffset = new int[numRec];
newSize = new int[numRec];
newNum = new int[numRec];
newType = new int[numRec];
newTime = new int[numRec];

するように頼みます:

struct FileData
{
    double fileTime;
    int offset;
    int size;
    int num;
    int type;
    int time;
};

FileData *newData = new FileData[numRec];

newData[i].fileTime = ... 

全体をより管理しやすくします。

于 2013-01-31T19:11:03.217 に答える