Следующие 2 функции фокусируются на строках с комментариями *. Когда кут<< оператор выполняется, десятичного знака нет. 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();
}
Есть идеи?
Всякий раз, когда вы делите два целых числа, результатом этого выражения также является целое число. Целочисленное деление всегда округляется в меньшую сторону.
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
Устанавливает количество значащих разрядов, а не десятичных дробей после десятичной точки. Так что ваши 302.1680
будет напечатан как 302.2
(четыре незначительные цифры). Чтобы установить фиксированное количество цифр после десятичной точки, также напишите std::fixed
в поток, до или после std::setprecision
:
std::cout << std::fixed << std::setprecision(4) << [some double values]
Обратите внимание, что такие конфигурации будут сохраняться во время выполнения вашей программы, пока вы не измените их снова. Чтобы сохранить их локальными в функции, убедитесь, что вы восстановили конфигурацию после того, как закончите.
Конечно, std::cout
был только примерный поток. То же самое относится к записи в файлы (любой std::ostream
объект).
Не совсем то, что вы просили (уже ответили), но это:
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 = ...
Делает все это гораздо более управляемым.