Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+;中的atof将十进制字符串转换为双精度字符串+;_C++_String_Atof_C Strings - Fatal编程技术网

C++ 使用C+;中的atof将十进制字符串转换为双精度字符串+;

C++ 使用C+;中的atof将十进制字符串转换为双精度字符串+;,c++,string,atof,c-strings,C++,String,Atof,C Strings,在我的程序中,我试图读取一个像“$876725.38”这样的文件,我能够删除逗号和美元符号,我现在尝试使用atof将字符串转换为双精度,但我现在遇到的问题是在打印money后,在转换后,我得到了大部分字符串之前的所有内容,但是,一些在周期前少于6位的用户会在周期后打印一位或两位数字。如果有人能解决这个问题,我们将不胜感激。我是C++新手,需要帮助。谢谢 主要问题:从字符串转换为双精度,十进制后的数据不打印 void readFile() { string line, nuMone

在我的程序中,我试图读取一个像“$876725.38”这样的文件,我能够删除逗号和美元符号,我现在尝试使用atof将字符串转换为双精度,但我现在遇到的问题是在打印
money
后,在转换后,我得到了大部分字符串之前的所有内容,但是,一些在周期前少于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);

    }

}
浮点(
float
double
long double
)对于存储精确的值不是很好。它们很好,因为它们可以很容易地对各种各样的值进行各种不同的数学运算,但是有许多值不能用IEEE浮点精确表示。像
0.1
这样简单的值不能用类型精确地表示,但是输入和输出例程经常取整,以使它们看起来处理正确


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

这似乎是由于浮点值的cout stream的默认精度:

您必须告诉输出流,您希望点后有2位的固定精度:

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

请不要!!输入、预期的输出和完全可编译的代码,这些代码再现了意外的行为。那么……问题出在哪里?我不明白,你的描述不清楚……将货币值存储为浮点数真是个坏主意。这是一个要求吗?@johnytran是一个整数。只需使用美分作为单位,而不是美元。相反,你可以使用
int
乘以100包含“美分”,除以100得到货币值。谢谢,我不太确定将这两个部分转换为一个整数的数学位。请进一步了解这一点。
#include <iomanip>
// ...
std::cout << std::fixed << std::setprecision(2) << MONEYS << '\n';