为何我的两位数反转C语言代码无法正常运行?
两位数反转代码失效的原因分析
你的代码失效的核心问题是浮点数精度误差,具体来说是float类型无法精确存储某些十进制小数,导致后续计算出现偏差。
错误案例拆解
以输入84为例:
input = 84,执行a = input * 0.1时,理论值是8.4,但float的二进制存储无法精确表示8.4,实际存储的是一个略小于8.4的值(比如8.399999618530273)digit_one = a:整数转换会直接截断小数部分,得到8b = a - digit_one:结果为0.399999618530273(而非预期的0.4)digit_two = b * 10:计算结果是3.99999618530273,整数转换后变成3,最终输出38
再看输入47的情况:
a = 47 * 0.1实际存储为4.699999809265137(而非精确的4.7)b = a - 4得到0.699999809265137,乘以10后是6.99999809265137,转整数后为6,最终输出64
输入48时成功是偶然情况:48*0.1=4.8的近似值在float精度下,截断小数后的误差刚好没影响到最终整数转换。
根本原因
十进制小数(比如0.1、0.4、0.7)在二进制系统中是无限循环小数,float类型只能用有限二进制位近似存储这些值,近似误差会在后续运算中被放大,最终导致整数转换结果错误。
更可靠的实现方法
用整数运算完全规避浮点数精度问题,通过取模和除法直接提取十位和个位:
int digit_one, digit_two, input; printf("Enter a two-digit number: "); scanf("%d", &input); digit_one = input / 10; // 整数除法取十位 digit_two = input % 10; // 取模运算取个位 printf("The reversal is: %d%d\n", digit_two, digit_one);
内容的提问来源于stack exchange,提问作者Redtunic
相关产品推荐
相关产品推荐

