6

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

当我做:

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);

我得到类似的东西:

我的浮点数是 15.6
我的整数是 5
我的大号是 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));?? 
4

4 回答 4

10

您可以使用“%.*f”进行格式化,它允许您将精度作为单独的参数传递给例如 sprintf。过去,当我想很好地显示 0、1、2 或 3 位数字而不需要额外的尾随 0 时,我曾使用过它。编写一个小辅助函数,它接受 double/float 并返回一个整数精度(乘以 1000,然后取模 10、100、1000)。然后用“%.*f”调用sprintf,调用辅助函数,传递float。

于 2009-05-06T00:20:14.233 回答
5

我不认为你可以得到这个%g,因为%g给你较短的%eor %f

所以,我认为没有一个printf论点能让你满意。对于 15.6,您可以使用%2.1f; 对于 7000000,您可以使用%7.0f.

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

于 2009-05-06T00:21:35.900 回答
3

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

于 2016-07-08T21:34:32.607 回答
1

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
于 2009-05-06T02:19:26.507 回答