如何使用sprintf格式化浮点数,其中精度可能会有所不同

时间:2014-04-29 09:44:01

标签: c++

我必须打印一个浮点值,但是在编译时不知道精度。 所以这个参数必须作为文件传递。如何实现这一目标。 在Windows中,使用CString,格式化功能有助于实现此目的。 没有CString如何实现这一目标。 代码:

int main()
{

   /* This below code segment works fine.*/
   char str[80];
   sprintf(str, "Value of Pi = %.3f", 3.147758);
   std::cout << str << std::endl; //Prints "Value of Pi = 3.148"

   /* When the precision may vary, henc It needs to be printed required on that.*/
   char str2[80];
   std::string temp = "%.3f";   //This is required as the precision may change. 
                                    // i.e I may have 4 instead 3 decimal points.
   sprintf(str2, "Value = %s", temp, 3.148257);
   std::cout << str2 << std::endl;  //Prints "Value = <null>"
   return 0;
}

5 个答案:

答案 0 :(得分:4)

你需要

"%.*f"

语法,其中&#34; *&#34;指的是下一个论点。

全是documented

答案 1 :(得分:1)

您可以使用std::stringstream将float转换为std :: string。 如果你想使用sprint。而不是使用*宽度。 Details here

答案 2 :(得分:1)

如果我理解你的问题,你可以使用setPrecision(..)来达到预期的结果:

#include <iostream>
#include <iomanip> // for setprecision()
int main()
{
    using namespace std;

    cout << setprecision(16); // show 16 digits
    float fValue = 3.33333333333333333333333333333333333333f;
    cout << fValue << endl;
    double dValue = 3.3333333333333333333333333333333333333;
    cout << dValue << endl;
}

答案 3 :(得分:0)

如果您可以使用iomanip,请执行以下操作:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int numOfDecimals = 2;// this controls precision. change to what ever you want
    float PI = 3.147758;

    cout << fixed << setprecision(numOfDecimals);
    cout << PI << endl;
    return 0;
}

答案 4 :(得分:0)

如果你想在运行中找到小数位数,你可以做类似下面的小数位数。这意味着您根本不必传递格式字符串。

#include <iostream>
using namespace std;

int main() 
{
double dNum = 3.14159265359, threshold = 0.00000000005;
double temp = dNum;
int count = 0;
while((temp - (int)temp) > threshold) 
{
    temp *= 10;  
    threshold *=10;
    count++;              
} 
char buffer[50];
sprintf(buffer,"value is = %.*f",count,dNum);
return 0;
}