5

如何防止 C++ 中的舍入错误或修复它?

例子:

float SomeNumber = 999.9999;
cout << SomeNumber << endl;

它打印出1000!

4

4 回答 4

4

cout您可以通过设置精度来更改舍入。

cout.precision(7);
float SomeNumber  = 999.9999;
cout << SomeNumber  << endl;

或者,您可以printf从 cstdio 使用。

于 2012-09-28T14:17:30.463 回答
3

默认情况下,格式化输出通过std::ostream将浮点值四舍五入为六位有效十进制数字。您需要七个才能避免您的数字被四舍五入到 1000:

cout << setprecision(7) << SomeNumber << endl;
        ^^^^^^^^^^^^^^^

float另外,请注意,假设常用的 32 位 IEEE 表示,您已接近 的精度限制。如果您需要超过 7 个有效数字,则需要切换到double. 例如,以下打印1000,无论您指定多少精度:

float SomeNumber = 999.99999; // 8 significant figures
cout << setprecision(10) << SomeNumber << endl;
于 2012-09-28T14:20:47.147 回答
1

为防止您的输出被四舍五入,请在 iomanip 中使用 setprecision。

float SomeNumber = 999.9999;
std::cout << SomeNumber << std::endl; //outputs 1000
std::cout << std::setprecision (7) << SomeNumber << std::endl; //outputs 999.9999
return 0;

但是,存储在 SomeNumber 中的实际值将始终为 999.9999,因此您无需担心值本身(除非您需要比 float 提供的精度更高的精度)。

于 2012-09-28T14:21:30.683 回答
0

如前所述,如果您只寻找 cout 舍入修复,请使用 .precision 函数。如果您指的是浮点数无法表示每个可能的分数,请阅读以下内容:

使用浮点数无法避免此类舍入错误。您需要以不同的方式表示您的数据。例如,如果您想要 5 位精度,只需将其存储为表示最小单位数的 long 即可。

即 5.23524 w/ 精度为 0.00001 可以用 long(或 int,如果您的值范围适合)表示为 523524。您知道单位是 0.00001,因此您可以轻松地使其工作。

于 2012-09-28T14:21:05.347 回答