-1

使用以下 2 个函数关注带有 * 注释的行。当 cout<< 语句执行时,不显示小数位。3021680380 /10000000 变成 302. 而不是 302.1680。

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

每当您将两个整数相除时,此表达式的结果也是一个整数。整数除法总是向下舍入。

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

要修复您的表达式,请将其中一个操作数转换为 adouble以使除法成为浮点除法(使用以下可能性之一):

    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设置大数字的数量而不是小数点后的小数。所以你302.1680会被打印为302.2(四个伟大的数字)。要在小数点后设置固定位数,还std::fixed可以在之前或之后写入流std::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 回答