如何在C中将小数点后的有效数字后加零?

时间:2018-12-12 14:52:27

标签: c formatting printf

double r;
float a;
scanf("%lf",&r);
a=M_PI*pow(r,2);
printf("%.*f",6,a);

输出为12.566371
但我想要这样的输出12.560000。

所以我希望小数点后总共6位数字,但是原始答案中只有2位数字,其余数字为0。

1 个答案:

答案 0 :(得分:0)

  

...小数点后总共6位数字,但原始答案只有2位数字,其余数字为0。

将舍入后的答案打印到所需的精度,然后使用"%0*d", zeros, 0打印零。

或发布处理文本以获取未取整的输出。

#include <math.h>
#include <stdio.h>
#ifndef M_PI
#define M_PI 3.1415926535897932384626433832795
#endif

int main() {
  double r = 2.0;
  double a = M_PI * pow(r, 2);

  int total_digits_after_decimal = 6;
  int zeros = 4;
  printf("%.*f%0*d\n", total_digits_after_decimal - zeros, a, zeros, 0);

  char buf[4096];
  int len = sprintf(buf, "%.*f", total_digits_after_decimal, a);
  buf[len - zeros] = '\0';
  printf("%s%0*d\n", buf, zeros, 0);

  return 0;
}

输出

12.570000
12.560000

注意:printf("%.*f",6,trunc(a*100)/100);的方法适用于a的许多值,但是当a非常大时失败,而对于a*100不精确且接近整数的选择值,则失败数字值。


通常面临的挑战是如何处理无穷大的数字。

缓冲区大小最坏的情况下,可以使用DBL_MAX_10_EXP(通常为308)将大小调整为buf[]

#include <float.h>
//     sign        digits     .             precision         \0
char buf[1 + DBL_MAX_10_EXP + 1 + total_digits_after_decimal + 1];

更深:

后处理方法仍将答案取整,但要保留在小数点后第六位而不是第二位。

为避免舍入,精度至少需要扩展到DBL_DECIMAL_DIG(C11)个位置或total_digits_after_decimal + 1-两者中取较大值。这样可以确保将文本输出舍入到可能影响事物的范围之外。

  int len = sprintf(buf, "%.*f", DBL_DECIMAL_DIG, a);
  buf[len - DBL_DECIMAL_DIG - (total_digits_after_decimal - zeros)] = '\0';
  printf("%s%0*d\n", buf, zeros, 0);

请注意@Paul Ogilvie好的建议。这里的编码目标对于生产代码是有问题的。

@kvantour之类的用户回应了对此好奇目标的可疑需求。