C语言如何使输出结果的小数位数与用户输入数值的小数位数一致?
C语言实现输出精度与输入小数位数匹配的方案
核心技术说明
你要实现的功能可以通过动态精度格式化输出实现,这是C标准库printf系列函数原生支持的特性:你可以用*作为格式串中精度位的占位符,运行时传入实际的精度值参数即可控制输出的小数位数。
你之前直接用scanf读取double类型变量的方式无法实现需求,因为浮点数在内存中仅存储数值本身,不会保留原始输入的小数位数信息,所以必须先读取用户输入的原始字符串,统计小数位数后再转换为数值计算。
修改后的可运行代码
#include <math.h> #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char input_buf[64] = {0}; double number, fourthRoot; int precision = 0; char *dot_pos = NULL; printf("Enter a number: "); // 先读取原始输入字符串 scanf("%s", input_buf); // 统计小数位数 dot_pos = strchr(input_buf, '.'); if (dot_pos != NULL) { // 小数点后剩余的字符数就是小数位数,可自行扩展过滤非数字字符的逻辑 precision = strlen(dot_pos + 1); } // 字符串转double做计算 number = atof(input_buf); fourthRoot = sqrt(sqrt(number)); // 用*动态指定精度输出 printf("4th root of number %.*lf is %.*lf", precision, number, precision, fourthRoot); return 0; }
代码逻辑说明
- 首先用字符数组接收用户的原始输入,保留输入的格式信息
- 通过
strchr查找小数点位置,统计小数点后的字符数作为输出精度,无小数点时精度为0 - 调用
atof将字符串转换为双精度浮点数完成四次方根计算 - 最后使用
%.*lf格式符,将统计得到的精度作为参数传入printf,实现输出小数位数和输入一致 - 如果需要处理非法输入、科学计数法输入等特殊场景,可以在此基础上扩展字符串校验逻辑即可
内容的提问来源于stack exchange,提问作者nocomment
相关产品推荐
相关产品推荐

