Преобразование строки с десятичной в двойную с использованием atof в переполнении стека

В моей программе я пытаюсь прочитать файл с деньгами вроде этого «$ 876,725.38». Мне удалось удалить запятую и знак доллара, и сейчас я пытаюсь преобразовать строку в двойное число, используя atof, но проблема, с которой я столкнулся, связана с печатью. MONEYS после преобразования я получаю все до периода на большинстве из них, но некоторые с менее чем 6 цифрами перед периодом печатают одну или две цифры после периода. Если у кого-то есть решение этого вопроса, оно будет с благодарностью. Я новичок в C ++ и нуждаюсь в помощи. Спасибо!

ОСНОВНАЯ ВОПРОС: Преобразование из строки в двойное, данные после десятичной не печатается.

    void readFile()
{
string line, nuMoney, munney, cents;
unsigned long dollarSign, period;ifstream myfile("MONEY.txt");

int numLines = countLines("MONEY.txt");
//cout << "NUMLINES: " << numLines << endl;

if (!myfile.is_open())
{
cout << "ERROR: File could not be opened." << endl;
}

for (int i=0; i < numLines-1; i++)
{
getline(myfile, line, '\n');
dollarSign = line.find('$');
period = line.find('.');

line.erase (remove(line.begin(), line.end(), ','), line.end()); //remove commas

munney = line.substr(dollarSign+1);
//cout << munney << endl;

//cents = line.substr(period);
//cout << "Cents: " << cents << endl;

//double CENTUS = atof(cents.c_str());
//cout << "CENTUS: " << CENTUS << endl;

double MONEYS = atof(munney.c_str());
cout << MONEYS << endl;

list<double> acct;
acct.push_back(MONEYS);

}

}

образец вывода:

937380
404261
814158
30218.1
69340.1
479891
517241
7203.55
975619
59219.4
900052
539774
336799
347700
532466
83496.8

-2

Решение

Вы должны сообщить выходному потоку, что вам нужна фиксированная точность в 2 цифры после точки:

#include <iomanip>
// ...
std::cout << std::fixed << std::setprecision(2) << MONEYS << '\n';
0

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

Плавающая запятая (float, double а также long double) не подходят для хранения точных значений. Они хороши тем, что позволяют легко выполнять множество различных математических операций в широком диапазоне значений, но есть много значений, которые невозможно точно представить с помощью плавающих точек IEEE. Значения так просто, как 0.1 не может быть точно выражено типом, но процедуры ввода и вывода часто округляются, чтобы создать впечатление, что они обрабатываются правильно.

Чтобы сохранить десятичные совершенные значения, я предлагаю при чтении считать две части значения как отдельные целые числа, преобразовывать дробную точку на основе количества цифр после десятичного знака, а затем выполнять математические вычисления для преобразования обеих частей. в одно целое число. Для денег США младший значащий бит этого целого числа может представлять 1 цент (если только дробные центы не должны быть точно представлены). Аналогичный подход может быть использован для вывода значений.

1

Похоже, это связано с точностью по умолчанию потока Cout для значений с плавающей запятой: http://www.cplusplus.com/reference/ios/ios_base/precision/

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