如何在 C++ 中使用 cout 打印逗号后没有附加零的整数值?

How do I print integer values without additional zeroes after comma by using cout in C++?

基本上我的代码是关于计算等边三角形周长的。 给定值是这些:

3
2.5 3 5.15

第一个数字定义了有多少个三角形,第二行中的数字是每个三角形的边长。

这是我的代码:

#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <cstdlib>+
using namespace std;

double Strik(double a);
int main()
{
    int n;
    cin>>n;
    double arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
        for(int i=0;i<n;i++){
        cout<<fixed<<setprecision(2)<<arr[i]<<" "<<Strik(arr[i])<<endl;
    }
    return 0;
}
double Strik(double a){
double s  = ((a*a)*sqrt(3))/4;
 return s;
 }

cout需要这样:

2.5 2.71
3 3.90
5.15 11.48

但我明白了:

2.5 2.71
3.00 3.90
5.15 11.48

请帮忙

std::setprecision 指定要使用的最大位数,如果你想一直获取 N 个数字,则需要使用 std::fixed.

#include <iostream>
#include <iomanip>

int main()
{
    double a = 3.5;
    std::cout << std::fixed;
    std::cout << std::setprecision(4);
    std::cout << a << "\n";
    return 0;
}

现在输出是 3.5000

std::fixed 相对的是 std::defaultfloat,在第一列中您需要 std::defaultfloat,但在第二列中您需要 std::fixed,所以这就是方法你:

cout << defaultfloat << setprecision(2) << arr[i] << " ";
cout << fixed << Strik(arr[i]) << endl;

查看 live

更新

如果如评论之一所述,您想要输出数字 13.6,则需要像这样提高精度:

cout << defaultfloat << setprecision(3) << arr[i] << " ";
cout << fixed << setprecision(2) << Strik(arr[i]) << endl;

您不能仅在一个 cout 语句中执行此操作。

你之前需要一个控制语句,它证明 Strik(arr[i]) 是否是一个整数值。通过 C++ 标准库中包含的 C 库,我们可以将 math.h 的 header 中 floorf() 函数的 return 值与 math.h 的实际值进行比较=12=],作为 if 语句的条件,如 if(floorf(Strik(arr[i])) == Strik(arr[i])) 来完成该任务:

所以程序的相关部分应该是这样的:

for(int i=0;i<n;i++)
{
    if(floorf(Strik(arr[i])) == Strik(arr[i]))
    {
       cout << fixed << setprecision(0) << arr[i] << " " << Strik(arr[i]) << endl;
    }

    else
    {
       cout << fixed << setprecision(2) << arr[i] << " " << Strik(arr[i]) << endl;
    }
}

您无法使用标准 C++ 操纵器做您想做的事。

您的选择是:

  1. << std::fixed << std::precision(2) << 设置精确的小数位数为 2
2.50 2.71
3.00 3.90
5.15 11.48
  1. << std::precision(2) <<设置有效位数为2
2.5 2.7
3 3.9
5.1 11

您可能认为 std::setprecision(3) 是您问题的答案,但请注意当您尝试打印 115.7 时会发生什么:

116

糟糕。

如果这对您真的很重要,实现它的唯一方法(无需编写 iostream 操纵器的巨大麻烦)就是自己进行从双精度到字符串的转换并 post-process结果..

版本 1:Trim 所有尾随零

#include <iostream>
#include <strstream>
#include <iomanip>
#include <string>


const std::string trim( double d )
{
   const int places=2;
   std::ostringstream out;
   out << std::setprecision(places) << std::fixed << d;
   std::string s = out.str(); // "3.19" or "5.00" or "212.70"
   s = s.substr( 0,  s.find_last_not_of( "0" )+1 );
   if ( s[s.size()-1]=='.') { s.erase(s.size()-1); }
   return s;
}

 ...

 cout<<trim(arr[i])<<" "<<trim(Strik(arr[i]))<<endl;

版本 2:Trim 整数中的“.00”,保留所有其他值

const std::string trim( double d )
{
   const int places=2;
   std::ostringstream out;
   out << std::setprecision(places) << std::fixed << d;
   std::string s = out.str(); // "3.19" or "5.00" or "212.70"
   if ( s[s.size()-1]=='0' && s[s.size()-2]=='0') { s.erase(s.size()-3); }
   return s;
}