十进制转二进制代码异常求助:输入13输出1100而非预期1101
十进制转二进制代码输出错误:输入13得到1100而非1101的解决方法
你的代码核心问题出在**pow()函数的浮点数精度误差**上:
pow()是用于浮点数运算的标准库函数,返回double类型值。当计算pow(10, i)时,比如pow(10,3),实际得到的可能不是精确的1000,而是类似999.9999999999999的近似值。- 当这个近似值乘以
n%2的结果(这里是1)后,再与整数binary相加时,会发生浮点数到整数的截断,相当于只加了999而非1000,最终导致结果比预期少1000,出现1100而非1101的错误。
修复方案1:用整数乘法替代pow()(推荐)
通过维护一个整数变量来记录10的幂次,完全避免浮点数运算的精度问题:
#include <iostream> using namespace std; int main(){ int n; cout << "Enter decimal number: "; cin >> n; int binary = 0; int power = 1; // 初始为10^0,每次循环乘10提升幂次 while(n != 0){ binary += power * (n % 2); n /= 2; power *= 10; } cout << "Equivalent binary is: " << binary; }
修复方案2:修正pow()的精度误差
如果坚持使用pow(),可以通过round()函数对结果进行四舍五入,确保得到精确的整数值:
#include <iostream> #include <cmath> using namespace std; int main(){ int n; cout << "Enter decimal number: "; cin >> n; int binary = 0; int i = 0; while(n != 0){ // 用round修正pow的精度偏差 binary += round(pow(10, i)) * (n % 2); n /= 2; i++; } cout << "Equivalent binary is: " << binary; }
你手动追踪时得到正确结果,是因为默认假设pow(10,i)返回精确整数,但实际代码中浮点数的精度特性打破了这个假设。
内容的提问来源于stack exchange,提问作者Goshawk
相关产品推荐
相关产品推荐

