You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中pow函数计算10^i出错,致整数转二进制程序异常

整数转二进制程序的pow函数问题解决建议

问题描述

编写的C++整数转二进制程序中,执行q=q+pow(10,i)*e;语句时出现计算错误:第三次迭代i=2时,pow(10,2)实际返回99而非预期的100,导致q的结果错误。

原代码

#include<iostream>
#include<cmath>
using namespace std;
int binary_conversion(int e,int w,int q,int n,int i)
{
  while(abs(w)>=1){//abs(e) to ensure that for negative numbers
    if(abs(w)>=1){
      e=w%2;
      w=w/2;
    }
    else
    {
      w=0;
    }cout<<"i is"<<i<<"\n";cout<<"q is before"<<q<<"\n";
       int r=pow(10,i);cout<<" r is"<<r;
    q=q+pow(10,i)*e;cout<<"q is"<<q<<"\n";
    i++;
 } return q ;
}
int main(){
  int n,w,q=0;int i=0,e;
  cin>>n;w=n;e=n;
  binary_conversion(e,w,q,n,i);
  cout<<q;
}

问题原因

pow()是浮点运算函数,返回值为double类型。由于浮点计算的精度特性,像10^2这样的计算可能会得到99.99999999999999这类接近100但略小的值。当你将这个double值直接赋值给int变量时,会自动截断小数部分,最终得到99。

解决方法

方法一:用整数乘法替代pow函数(推荐)

避免浮点运算的精度问题,用一个整数变量维护10的幂次,每次迭代时更新:

  • 初始化int power = 1;
  • 每次循环结束后执行power *= 10;,用power代替pow(10,i)

方法二:对pow结果做四舍五入处理

如果一定要使用pow,可以用round()函数对结果进行四舍五入,修正浮点误差:

int r = round(pow(10, i));

额外修复:函数返回值未正确接收

原代码中binary_conversion采用值传递参数,主函数里的q不会被函数内的修改影响,最后输出的始终是初始的0。需要在主函数中接收函数的返回值:

q = binary_conversion(e, w, q, n, i);

修正后的示例代码

#include<iostream>
#include<cmath>
using namespace std;

int binary_conversion(int e, int w, int q, int n, int i)
{
    int power = 1;
    while(abs(w) >= 1){
        e = w % 2;
        w = w / 2;
        
        cout << "i is" << i << "\n";
        cout << "q is before" << q << "\n";
        cout << " power is" << power;
        
        q = q + power * e;
        cout << "q is" << q << "\n";
        
        i++;
        power *= 10;
    } 
    return q ;
}

int main(){
    int n, w, q = 0;
    int i = 0, e;
    cin >> n;
    w = n;
    e = n;
    q = binary_conversion(e, w, q, n, i);
    cout << q;
}

内容的提问来源于stack exchange,提问作者Sarala .D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:05:46