2

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

我的数据文件如下所示:

105670.00 12345.00 0.057 4

基本上正在发生的事情是我在前两个数字的小数点后丢失了所有东西(不管我输入的小数点是什么),但它不会发生在第三个数字上。此外,当我尝试设置前两个数字的精度(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() 在这种情况下不能按照预期的方式工作?

任何回复都非常感谢,我很抱歉它的解释如此冗长。

4

2 回答 2

3

您还需要设置fmtflagsfixed

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

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

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

于 2012-10-31T16:18:37.900 回答
0

float 通常具有 24 位二进制精度,这意味着它可以存储大约 6 位精度的十进制数字,因此如果您的数字大于 100000,您将根本无法获得十进制数字的任何精度。

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

这很可能回答了你的具体问题,但如果这是为了钱,你可能根本不应该使用浮动格式,因为它们不能准确地表示 0.01 作为一个值,所以你所有的计算都是近似的,你可能在处理金钱时不希望那样。通常将便士/美分/任何整数的数量保存在整数中并要小心:) 甚至更好的是专门为处理货币价值而设计的类,因为通常有四舍五入等法律要求。

于 2012-10-31T16:23:17.293 回答