不正确地使用SetPrecision

时间:2013-01-31 19:01:19

标签: 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();
}

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

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

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

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

答案 1 :(得分: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 = ... 

使整个事情更易于管理。