2013-01-31 31 views
-1

以下2個函數着重於帶*註釋的行。當語句執行時,不會顯示小數位。 3021680380/10000000變爲302.而不是302.1680。錯誤地使用SetPrecision

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

編輯標題停止指責經過良好測試的庫代碼。 – djechlin

+2

這不是你如何使用'setprecision()'。見http://www.cplusplus.com/reference/iomanip/setprecision/ – NPE

+0

它可能不是傳統的,但它的作品 – theB3RV

回答

5

每當你除兩個整數時,這個表達式的結果也是一個整數。整數除法總是舍入。

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

要解決你的表達,鑄就一個操作數爲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設置壯美digets的數量,而不是小數點後的小數。所以你的302.1680將被打印爲302.2(四個maginificant數字)。要設置小數點後位一個固定數量,還寫std::fixed流中,無論是之前還是std::setprecision後:

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

注意,這樣的配置將你​​的程序的運行過程中,直到您更改保存他們再次。要讓它們保持本地功能,請確保在完成後恢復配置。

當然,std::cout只是一個示例流。這同樣適用於寫入文件(任何std::ostream對象)。

+0

大聲笑哇...謝謝! – theB3RV

+0

@ theB3RV另請參閱我的編輯,瞭解關於'setprecision'的更多註釋。 – leemes

+0

輸出在這一點上是重要的,它被髮送到一個文件,然後一個完全不同的程序從文件讀入,就像操縱數據一樣。再次感謝! – theB3RV

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 = ... 

使整個事情更易於管理。

+0

當然是這樣的:D這是我試圖在3天內完成這個hw:P – theB3RV

+0

newData = new FileData [numRec];行說newData沒有在這個範圍內聲明? – theB3RV

+0

是的,你需要在前面的「FileData *」(編輯後) –