如何防止C ++中的舍入错误或修复它?
示例:
float SomeNumber = 999.9999;
cout << SomeNumber << endl;
打印出1000!
答案 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,所以你可以很容易地使它工作。