C ++ Float Truncation&设置精度逻辑错误

时间:2012-10-31 16:12:06

标签: c++ file-io io floating-accuracy truncation

我看了一会儿,但在这里找不到答案,但这似乎是一个奇怪的问题。我正在使用C ++中的fstream库。我要做的是从输入文件中获取数据,为其分配变量,并将其输出到屏幕和输出文件。这就是我正在研究的一个项目,它计算汽车贷款的每月付款,这就是变量按照它们的方式命名的原因。

我的数据文件如下所示:

105670.00 12345.00 0.057 4

基本上正在发生的事情是我在前两个数字的小数后丢失所有内容(不管我把它作为小数点),但它不会发生在第3个数字上。另外,当我尝试前两个数字的setprecision(2)时,我得到一个奇怪的逻辑错误,我将在我的代码后显示。

我的代码看起来像这样:
#include<fstream>
#include<iomanip>
#include<iostream>
using namespace std;

int main ()
{
ifstream din; // These are my input and output files
ofstream dout;
float purchasePrice; // The first number of the input file.
float downPayment; // Second number.
float annualInterest; // Third number.
float numYears; // Last number.

// declaring the input/output files code here

din >> purchasePrice >> downPayment >> annualInterest >> numYears;

cout << purchasePrice << endl;
cout << downPayment << endl;
cout << annualInterest << endl;
cout << setprecision(2) << purchasePrice << endl;
cout << setprecision(2) << downPayment << endl;
cout << setprecison(2) << annualInterest << endl;
}
这是我的输出:

105670 12345 0.057 1.1E + 005 1.2E + 004 0.057

我希望我的输出是:

105670.00 12345.00 0.057 105670.00 12345.00 0.05

此外,在执行任何计算时,数字的作用就好像它们仍然包含小数点后的所有内容。我的问题是,为什么只有一些浮点数被截断,为什么setprecision()在这种情况下不能按预期的方式工作?

非常感谢任何回复,对不起,这是一个冗长的解释。

2 个答案:

答案 0 :(得分:3)

您还需要将fmtflags设置为fixed

std::cout << std::fixed << std::setprecision(2) << purchasePrice << "\n";

如果不指定scientificfixed,输出机制将使用被认为最佳的任何方案。你知道什么是“最好的”,这是一个定点方案。有关更多详细信息,请参阅http://en.cppreference.com/w/cpp/io/manip

更好的是,在处理金钱时根本不使用浮点数。使用一些定点算术包要好得多。

答案 1 :(得分:0)

float通常有24个二进制位的精度,这意味着它可以存储大约6个十进制数字的精度,所以如果你的数字大于100000,你将不会得到任何精度的十进制数字。

你应该使用 double ,在这种情况下,它具有大约15位小数的精度,而不是 float

最有可能回答你的具体问题,但如果这是为了钱,你可能根本不应该使用浮动格式,因为它们可以;例如,t恰好代表0.01作为值,所以你的所有计算都是近似的当你处理钱时,你可能不希望这样。通常持有便士/美分/以整数为单位的数量并小心:)或者更好的是专门设计用于处理货币价值的类,因为通常有关于舍入等的法律要求。