Неправильное использование SetPrecision

Следующие 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();
}

Есть идеи?

-1

Решение

Всякий раз, когда вы делите два целых числа, результатом этого выражения также является целое число. Целочисленное деление всегда округляется в меньшую сторону.

    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 объект).

5

Другие решения

Не совсем то, что вы просили (уже ответили), но это:

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

Делает все это гораздо более управляемым.

2

По вопросам рекламы [email protected]