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

二进制小数转十进制小数程序输出错误求助

二进制小数转十进制小数的问题修复

先纠正转换公式

你提到的公式有误,二进制小数转十进制应该用2的负幂次,不是10的。以10.110为例,小数部分的正确计算是:
1×2^-1 + 1×2^-2 + 0×2^-3 = 0.5 + 0.25 + 0 = 0.75

原代码的核心问题

  • 进制逻辑混淆:误用10的幂次计算,二进制转十进制需用2的幂次
  • 数组索引错误:c[i]中的i是小数点的位置,不是当前循环的元素索引,应改为c[m]
  • 字符转数字错误:直接使用c[m]会取到字符的ASCII值,需转换为对应的数字(如'1'转成1,'0'转成0)
  • 变量类型错误:用int存储小数结果会丢失精度,应使用double或decimal
  • 循环逻辑混乱:每次循环重置x为-1,计算逻辑完全不符合二进制转十进制的规则

修复后的小数部分转换代码

string a = "10.110";
if (a.Contains('.'))
{
    int dotIndex = a.IndexOf('.');
    string fractionalPart = a.Substring(dotIndex + 1);
    double decimalValue = 0;

    for (int m = 0; m < fractionalPart.Length; m++)
    {
        // 将字符转换为对应的数字
        int bit = fractionalPart[m] - '0';
        // 计算当前位的权重:2的-(m+1)次方
        double weight = Math.Pow(2, -(m + 1));
        decimalValue += bit * weight;
    }

    Console.WriteLine(decimalValue); // 输出0.75
}

包含整数部分的完整转换代码

如果需要同时处理整数部分,可在此基础上补充:

string a = "10.110";
double totalValue = 0;

if (a.Contains('.'))
{
    int dotIndex = a.IndexOf('.');
    // 处理整数部分
    string integerPart = a.Substring(0, dotIndex);
    for (int m = 0; m < integerPart.Length; m++)
    {
        int bit = integerPart[m] - '0';
        double weight = Math.Pow(2, integerPart.Length - 1 - m);
        totalValue += bit * weight;
    }

    // 处理小数部分
    string fractionalPart = a.Substring(dotIndex + 1);
    for (int m = 0; m < fractionalPart.Length; m++)
    {
        int bit = fractionalPart[m] - '0';
        double weight = Math.Pow(2, -(m + 1));
        totalValue += bit * weight;
    }
}
else
{
    // 无小数部分的情况
    for (int m = 0; m < a.Length; m++)
    {
        int bit = a[m] - '0';
        double weight = Math.Pow(2, a.Length - 1 - m);
        totalValue += bit * weight;
    }
}

Console.WriteLine(totalValue); // 输出2.75,对应二进制10.110的完整十进制值

内容的提问来源于stack exchange,提问作者user21264001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:45:34