如何在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)。
- 包括stdlib.h
- 包括math.h
-
math.h
IF函数pow
无法编译,必须用gcc file.c -o file -lm
编译 - 试试这个例子:
输入: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 ); }