C++ 使用C+;中的atof将十进制字符串转换为双精度字符串+;
在我的程序中,我试图读取一个像“$876725.38”这样的文件,我能够删除逗号和美元符号,我现在尝试使用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
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';