如何创建一个字符串,以便它将浮点数格式化为没有尾随的小数点,如果它是一个整数,但不要切换到更大数字的科学记数法?

当我这样做时:

float myFloat= 15.6f;
float myInt = 5.0f;
float myLarge = 7000000.0f;
sprintf(out, "my float is %g", myFloat);
sprintf(out, "my int is %g", myInt);
sprintf(out, "my large is %g", myLarge);

我得到类似的东西:

my float is 15.6
my int is 5
my large is 7e+07f

我希望所有单个格式字符串都能提供15.6,5和700000。

编辑的原因评论不进行格式化:

这就是我的想法。但是包装器非常不方便,因为格式字符串嵌入在更长格式的字符串中:

sprintf(buf, "%d %g", myInt, myFloat);

你如何包装?

sprintf(buf, "%d %g", myInt, Wrapper(myFloat));??

Wrapper应该返回什么?或者更糟:

sprintf(buf, "%d %s", myInt, Wrapper(myFloat));?? 
有帮助吗?

解决方案

我认为你不能用%g 来解决这个问题,因为%g 会给你更短的%e %F

所以,我认为没有一个 printf 参数满足你。对于15.6,您可以使用%2.1f ;对于7000000,您可以使用%7.0f

您最好的选择可能是编写一个包装函数来查看您的值的大小并应用正确的 printf 参数。

其他提示

您可以使用“%。* f”进行格式化,这样您就可以将精度作为单独的参数传递给sprintf的。我过去曾经使用过这个,当我想要显示0,1,2或3位数而没有额外的尾随0时。编写一个小辅助函数,它接受double / float并返回一个整数精度(乘以1000然后进行模数10,100,1000)。然后用“%。* f”调用sprintf,调用辅助函数,并传递浮点数。

Mike的方法是合理的,但您可以使用log10函数直接计算位数,并使用floor或ceil来验证您实际上是否具有整数值。类似的东西:

#include <math.h>
double x;
...
if (floor(x) == x && x != 0.0) { // x is an non-zero integer value
    int digits = floor(log10(fabs(x)+0.5)) + 1;
    printf("x is %.*f\n", digits, x);
}

解包那个函数调用链,我们首先取绝对值以确保参数是非负的,将0.5添加到已知的整数值以处理计算log10中精确幂为10的任何可能的舍入错误,结合log10和floor来获得比fabs(x)+0.5小10的最大功率的指数,最后加1以得到表示x所需的位数。以下是一些示例值(来自OpenOffice,但C log10函数应以相似的精度计算):

         x          log10(x+0.5)
         1  0.176091259055681000
         9  0.977723605288848000
        10  1.021189299069940000
        99  1.997823080745730000
       100  2.002166061756510000
       999  2.999782798454140000
      1000  3.000217092972230000
     10000  4.000021714181250000
    100000  5.000002171466980000
   1000000  6.000000217147190000
  10000000  7.000000021714720000
 100000000  8.000000002171470000
1000000000  9.000000000217150000

将%g替换为%。10g以显示最多10位有效数字

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top