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

时间:2015-01-25 02:56:38

标签: c scanf

scanf()函数中,我想只取小数值。我们能实现它吗? 例如,为了显示最多两个小数位,我们使用printf("%.2f",A)  我们怎样才能为scanf()函数做到这一点。

4 个答案:

答案 0 :(得分:3)

您不能这样做,如果您愿意,可以让scanf()读取特定数量的字符

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

并假设输入为

43.23

它会读

43.2

但您无法指定精度。

没有意义,你可以做的是

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

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

答案 1 :(得分:3)

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语法等。但问题很明显:读取数据然后限定数据读取。不要试图限制输入。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  1. 包括stdlib.h
  2. 包括math.h
  3. 来自DeviceAdapter的IF函数pow无法编译,必须使用math.h进行编译
  4. TRY示例:
  5.   

    输入:13254.45488

         

    输出:13254.45

    gcc file.c -o file -lm