std::cout.precision() 的正确使用方法 - 不打印末尾的零

32

我看到很多关于浮点数精度的问题,但是我特别想知道为什么这段代码

#include <iostream>
#include <stdlib.h>
int main()
{
  int a = 5;
  int b = 10;
  std::cout.precision(4);
  std::cout << (float)a/(float)b << "\n";
  return 0;
}

显示 0.5?我希望看到的是 0.5000。 这是因为原始的整数数据类型吗?

3个回答

40
#include <iostream>
#include <stdlib.h>
#include <iomanip>
int main()
{
  int a = 5;
  int b = 10;
  std::cout << std::fixed;
  std::cout << std::setprecision(4);
  std::cout << (float)a/(float)b << "\n";
  return 0;
}

为了显示尾随零,您需要将 std::fixed 操纵符传递给 cout


6

std::cout.precision(4);指定的是要使用的数字的最大位数,而不是最小位数。 这意味着,例如,如果您使用了

precision 4 on 1.23456 you get 1.235  
precision 5 on 1.23456 you get 1.2346

如果您希望始终保留n位小数,您需要使用std :: fixed。

1
这里有一个小错误。它不会打印 1.2341.2345,而是会将最后一位数字四舍五入并打印 1.2351.2346 - Natarich J

2
行为正确。该参数指定要使用的最大有效数字,而不是最小数字。如果后面只有0,则不会打印它们,因为小数部分末尾的0没有意义。如果要打印这些0,则需要设置适当的标志:
std::cout.setf(std::ios::fixed, std::ios::floatfield);

这将把符号设置为“fixed”,打印所有数字。


请您详细说明一下 fixedfloatfield,特别是 floatfield。是否有其他方法可以实现它?例如 std::cout.setf(std::ios::right); 相当于 std::cout << std::right; - Abhishek Mane
我想我明白了。它等同于 std::cout<<std::fixed; 你所解释的是通过使用 showpoint 实现打印尾随零。 - Abhishek Mane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接