如何在 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++ 操纵器做您想做的事。
您的选择是:
<< std::fixed << std::precision(2) <<
设置精确的小数位数为 2
2.50 2.71
3.00 3.90
5.15 11.48
<< 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;
}
基本上我的代码是关于计算等边三角形周长的。 给定值是这些:
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++ 操纵器做您想做的事。
您的选择是:
<< std::fixed << std::precision(2) <<
设置精确的小数位数为 2
2.50 2.71
3.00 3.90
5.15 11.48
<< 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;
}