不正确地使用SetPrecision

the*_*3RV -1 c++ precision double-precision

使用以下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();
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

lee*_*mes 5

除非分割两个整数,否则此表达式的结果也是整数.整数除法总是向下舍入.

    newFileTime[i] = fileTime[i] / 10000000;
    //               ^^^^^^^^^^^   ^^^^^^^^
    //                   int          int
Run Code Online (Sandbox Code Playgroud)

要解决你的表达,铸就一个操作数为double使部门的浮点除法(使用一个下列可能性):

    newFileTime[i] = static_cast<double>(fileTime[i]) / 10000000;
    // or
    newFileTime[i] = fileTime[i] / 10000000.0;
Run Code Online (Sandbox Code Playgroud)

请注意,设置精度需要您将调用std::setprecision(...)放入要设置精度的流中.此外,这仅设置输出精度(写入流时),而不是如何执行计算:

    std::cout << std::setprecision(4) << [some double values]
Run Code Online (Sandbox Code Playgroud)

另请注意,std::setprecision设置magnificant digets的数量而不是小数点后的小数.因此,您302.1680将被打印为302.2(四个巨大的数字).要在小数点后设置固定的位数,还要std::fixed在之前或之后写入流std::setprecision:

    std::cout << std::fixed << std::setprecision(4) << [some double values]
Run Code Online (Sandbox Code Playgroud)

请注意,在程序运行期间将保留此类配置,直到您再次更改它们为止.要使它们在函数中保持本地,请确保在完成后恢复配置.

当然,std::cout只是一个示例性的流.这同样适用于写入文件(任何std::ostream对象).