如何防止c ++中的舍入错误?

时间:2012-09-28 14:12:35

标签: c++ rounding

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

示例:

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

打印出1000!

4 个答案:

答案 0 :(得分:4)

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

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

或者,您可以使用cstdio中的printf

答案 1 :(得分:3)

默认情况下,通过std::ostream格式化的输出将浮点值舍入为六位有效小数。您需要七个以避免将您的号码舍入为1000:

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

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

float SomeNumber = 999.99999; // 8 significant figures
cout << setprecision(10) << SomeNumber << endl;

答案 2 :(得分: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提供更多的精度)。

答案 3 :(得分:0)

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

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

即。 5.23524 w / 0.00001的精度可用long表示(如果你的值范围合适则为int)为523524.你知道单位是0.00001,所以你可以很容易地使它工作。