我希望写出一段代码,使得输出结果和输入内容一样精确。例如,如果我执行以下代码:
scanf("%f", &n);
printf("%f", n);
如果我输入 1.2
,它应该输出 1.2
,但实际上输出的是 1.200000
。同样对于整数也是一样的,如果我输入 9
,它只应该输出 9
,而不是 9.00
。有没有什么方法可以解决这个问题?
OP没有说明如何处理像"9.00"这样的输入。我认为OP希望看到"9.00"打印出来,而不是像输入一样只有个位数和十分位。
首先需要将数字读取为字符串,以便稍后评估其精度。数字及其精度需要分别存储在变量中。建议使用@bgamlath提出的结构体。
使用sscanf()
或atof()
解析字符串。
解析字符串以查找'.'
的位置。
int VikasRead(float *value, int *precision) {
char buf[100];
*precision = 0;
if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;
int end;
int retval = sscanf(buf, "%f%n", value, &end);
char * dp = strchr(buf, '.');
if (dp != NULL && retval == 1) {
*precision = &buf[end] - dp;
}
return retval;
}
int VikasWrite(float value, int precision) {
int retval;
if (precision > 1) {
// Note: printf("%.*f\n", 0, value) is UB.
retval = printf("%.*f\n", precision - 1, value); // 1.234
}
else if (precision == 0) {;
retval = printf("%.0f\n", value); // 123
}
else {
retval = printf("%#.0f\n", value); // 123.
}
return retval;
}
void VikasTest(void) {
float value;
int precision;
while (VikasRead(&value, &precision) == 1) {
VikasWrite(value, precision);
}
}
1.23e56
会使过程变得复杂,但方法仍然相同。需要额外查找'e'
或'E'
。','
作为小数点,进一步增加了复杂性。一种解决方案是将所有用户输入存储为它们本身。使用 char
指针和 gets()
或 scanf("%s", ...)
。
如果您还想在计算中使用它们,请使用 atof 进行转换。
此外,您可以使用结构体来存储输入表示和数值。
stract Number{
float val;
char * representaion; // or only precision if you like.
}
%0.7g
,因为float
的最大精度为7位数字。#include <stdio.h>
int numberLenght(float d);
int main(void)
{
float d;
printf("input: ");
scanf("%f", &d);
printf("your input was: %0.7g\n", d);
return 0;
}
对于 double
类型,请使用 %0.16g
(double
的最大精度为 16 位数字)
float
和double
的最小精度分别为6和10位数字,但没有规定最大精度的限制。请参考Printf width specifier to maintain precision of floating-point value。 - chux - Reinstate Monica
%g
可能会选择使用 e-notation 格式。 - 0xF1