double r;
float a;
scanf("%lf",&r);
a=M_PI*pow(r,2);
printf("%.*f",6,a);
输出为12.566371
但我想要这样的输出12.560000。
所以我希望小数点后总共6位数字,但是原始答案中只有2位数字,其余数字为0。
答案 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之类的用户回应了对此好奇目标的可疑需求。