在C ++中使用atof将带小数的字符串转换为double

时间:2015-03-27 18:58:27

标签: c++ string atof c-strings

在我的程序中,我试图用这样的钱读取文件" $ 876,725.38"我能够删除逗号和美元符号,我现在正在尝试使用atof将字符串转换为double,但现在我遇到的问题是在转换后打印MONEYS之后我获得了大部分时间之前的所有内容这些,但在句号之前少于6位的一些数字在句点之后打印一个或两个数字。如果有人有解决方案,我们将不胜感激。我是C ++的新手,需要帮助。谢谢!

MAIN ISSUE:从字符串转换为double,十进制后的数据不会打印。

    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

3 个答案:

答案 0 :(得分:1)

浮点(floatdoublelong double)对于存储精确值并不是很好。它们非常棒,因为它们可以很容易地在很多值上进行大量不同的数学计算,但有许多值无法用IEEE浮点数精确表示。像0.1这样简单的值不能完全由类型表示,但输入和输出例程通常是圆形的,以使它看起来像是正确处理的。

要存储十进制完美值,我建议在读入时将值的两个部分视为单独的整数,根据读入小数位后的位数转换小数点,然后进行一些数学运算将两个片段转换为单个整数。对于美国货币,此整数的LSB(最低有效位)可能代表1美分(除非需要准确表示小数美分)。可以使用类似的方法输出值。

答案 1 :(得分:0)

由于浮点值的cout流的默认精度,它看起来像是http://www.cplusplus.com/reference/ios/ios_base/precision/

答案 2 :(得分:0)

您必须告诉输出流您想要点后的2位数的固定精度:

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