如何在scanf中只接受一定的精度(如此多的小数位)?

scanf()函数中,我想只取十进制值。我们能实现它吗? 例如,为了显示最多两个小数位,我们使用printf("%.2f",A)我们如何为scanf()函数执行此操作。

scanf()没有一个简单的方法来满足OP的目标。
建议使用fgets()进行输入,然后解析字符串。

 char buf[20]; fgets(buf, sizeof buf, stdin); // Could add check for NULL here 

要限制为2位小数,代码可以读取部分数字:整数部分和分数,然后形成结果:

 long long ipart; unsigned d[2]; int n; if (sscanf(buf, "%lld.%1u%1u %n", &ipart, &d[0], &d[1], &n) != 3 || buf[n]) { Handle_InvalidInput(); } double value = (d[0]*10 + d[1])/100.0; value = ipart + ipart < 0 ? -value : value; 

尽管这符合OP的要求,但我认为它不会解决OP更大的目标。 因此,不要限制输入,阅读输入,然后限定它:

 double value; if (sscanf(buf, "%lf %n", &value, &n) != 1 || buf[n]) { Handle_InvalidInput(); } double rounded_value = round(value * 100.0)/100.0; if (rounded_value != value) { Handle_OverlyPreciseNumber(value, rounded_value); } 

其他更迂腐的方法会检查字符串buf的ddd ... ddd.dd语法等。但问题很明显:读取数据然后限定读取的数据。 不要试图限制输入。

您不能这样做,您可以根据需要使scanf()读取特定数量的字符

 float value; scanf("%4f", &value); 

并假设输入是

 43.23 

它会读

 43.2 

但你不能指定精度。

它没有意义,你能做的是

 float value; if (scanf("%f", &value) == 1) printf("%.2f\n", value); 

毕竟,精度受二进制表示的限制,因此只有两个小数位是没有意义的,因为在算术运算中它可能是四舍五入的。

在scanf中无法提及精度。 但是,您可以限制输入字符的数量,如scanf(“%4f”,&a)。

  1. 包括stdlib.h
  2. 包括math.h
  3. math.h IF函数pow无法编译,必须用gcc file.c -o file -lm编译
  4. 试试这个例子:

输入:13254.45488

产量:13254.45

 void main() { int x,y,i ; int precision = 2 ; /*Insert precision here*/ char a[precision] ; long double z,result ; printf( "Input : " ); scanf( "%d" , &x ); for ( i = 0 ; i <= precision ; i++ ) { a[i] = getchar(); if ( a[i] == 10 ) break; } a[0] = '0'; a[i] = '\0'; y = atoi(a); z = y / pow( 10 , i-1 ); result = x ; if ( z != 0 ) result = result + z ; printf( "Output: " ); printf( "%.*Lf\n", i-1 , result ); }