在scanf()
函数中,我想只取小数值。我们能实现它吗?
例如,为了显示最多两个小数位,我们使用printf("%.2f",A)
我们怎样才能为scanf()
函数做到这一点。
答案 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)
DeviceAdapter
的IF函数pow
无法编译,必须使用math.h
进行编译输入:13254.45488
输出:13254.45
gcc file.c -o file -lm