如何在C中将float拆分为两个整数

时间:2014-03-01 07:47:23

标签: c format-specifiers

下面我试图设置一个格式说明符,但每次调用该函数时我都想做不同的操作。关键是打印浮点数Data_Ave。在一个实例中,我想要说明符%2.3f,因此我将为sig_figs_before传递函数a 2,为sig_figs_after传递3。在下一个例子中,我想要%1.4f,所以我会通过那些整数。

char * Send_Data(float Data[10], const char* SUBJECT_SEND_NAME, char *Data_Backup, int sig_figs_before, int sig_figs_after)
{
  float Data_Ave = ((Data[0] + Data[1] + Data[2] + Data[3] + Data[4] +
            Data[5] + Data[6] + Data[7] + Data[8] + Data[9])/10);
  sprintf(msgBody,"%%i.%if, ", before_decimal, after_decimal, Data_Ave);
  ... //Some more code
  }

我很确定这不起作用,所以我想把浮动分成两个整数并按照这样打印:

sprintf(msgBody,"%i.%i, ", int_value, decimal_value);

但我不知道如何正确拆分浮子。 有什么建议吗?

3 个答案:

答案 0 :(得分:5)

你想:

sprintf(msgBody,"%*.*f, ", before_decimal+after_decimal+1, after_decimal, Data_Ave);

请注意,您可以使用*通过整数参数指定宽度。另请注意,在%N.Mf格式中,N是打印数字的总大小(包括小数,点,符号,指数,填充等),M是小数精度。这就是为什么,在您的情况下,第一个数字应仅为before_decimal+after_decimal+1而不是before_decimal

答案 1 :(得分:2)

您可以使用sprintf两次获得所需的结果 - 一次获取格式字符串,然后再次获取实际结果。

sprintf(format, "%%%i.%if", before_decimal, after_decimal);
sprintf(msgBody, format, Data_Ave);

第一行将写入,例如(2和3)%2.3f进入format;第二行将对该格式字符串进行操作以写入msgBody

您还应该考虑使用snprintf代替sprintf,尤其是因为您使用的是可变长度的字符串 - 不想导致buffer overflow

答案 2 :(得分:0)

sprintf()未提供“之前的重要数据”。

它提供最小字段宽度,可以从sig_figs_beforesig_figs_after和值本身派生。

char * Send_Data(float Data[10], const char* SUBJECT_SEND_NAME, 
    char *Data_Backup, int sig_figs_before, int sig_figs_after) {

  assert(sig_figs_before >= 1);
  assert(sig_figs_after >= 0);

  float Data_Ave = ((Data[0] + Data[1] + Data[2] + Data[3] + Data[4] +
                     Data[5] + Data[6] + Data[7] + Data[8] + Data[9])/10);

  int width = sig_figs_before + 1 + sig_figs_after;  // +1 for '.'
  // Make room for '-'
  if (Data_Ave < 0) width++;
  sprintf(msgBody, "%#*.*f, ", width, sig_figs_after, Data_Ave);
}

'#'应该sig_figs_after == 0用于保留小数点。

注意:这不是限制宽度或sig_figs_before应该Data_Ave的数量。 @Matt Patenaude使用snprintf()的想法很好。

黑客的方法是测试:

if (log10(fabs(Data_Ave)+0.5) > sig_figs_before) UseAlternativePrint();