首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言小程序:十進制小數轉二進制小數(含整數/小數部分遞歸實現)

     編輯:關於C語言

前言

十進制浮點數轉二進制是計算機組成原理與嵌入式開發常見練習。本程序採用**遞歸**分別處理整數部分(除 2 取餘逆序)與小數部分(乘 2 取整順序),支援負數、可配置目標進制(預設二進制),代碼簡潔適合教學。

完整代碼


#include <stdio.h>
#include <stdlib.h>

#define BASE 2
#define EPS 1e-6   // 小數部分終止閾值

// 遞歸輸出整數部分:除基取餘,逆序列印
void printIntPart(int n) {
    if (n > 0) {
        printIntPart(n / BASE);
        printf("%d", n % BASE);
    }
}

// 遞歸輸出小數部分:乘基取整,順序列印
void printFracPart(double f) {
    if (f > EPS) {
        f *= BASE;
        int digit = (int)f;
        printf("%d", digit);
        printFracPart(f - digit);
    }
}

int main() {
    double input;
    printf("請輸入一個十進制小數: ");
    if (scanf("%lf", &input) != 1) return 1;

    // 處理負數
    if (input < 0) {
        printf("-");
        input = -input;
    }

    int intPart = (int)input;
    double fracPart = input - intPart;

    printf("轉換為 %d 進制: ", BASE);
    if (intPart == 0) printf("0");
    else printIntPart(intPart);

    if (fracPart > EPS) {
        printf(".");
        printFracPart(fracPart);
    }
    printf("\n");

    system("pause");  // Windows 保持控制台
    return 0;
}

執行範例

請輸入一個十進制小數: 13.625
轉換為 2 進制: 1101.101

請輸入一個十進制小數: -7.1
轉換為 2 進制: -111.0001100110011...

算法原理圖解

整數部分(13 → 1101)

13 / 2 = 6 ... 1
 6 / 2 = 3 ... 0
 3 / 2 = 1 ... 1
 1 / 2 = 0 ... 1   (商為 0 結束)
讀餘數逆序:1101

小數部分(0.625 → .101)

0.625 × 2 = 1.25 → 整數 1,餘 0.25
0.25  × 2 = 0.5  → 整數 0,餘 0.5
0.5   × 2 = 1.0  → 整數 1,餘 0.0 (結束)
讀整數順序:101

擴展與注意事項

  • 循環小數**:如 0.1 (十進制) 在二進制下為無限循環 `0.0001100110011...`,程序靠 `EPS` 截斷,實際應用可加最大位數限制(如 52 位雙精度尾數)。
  • 任意進制**:修改 `BASE` 宏即可支援 8/16 進制,`BASE > 10` 時需補充字母輸出邏輯。
  • 精度陷阱**:`double` 二進制浮點本身無法精確表示許多十進制小數(如 0.1),輸入已含誤差,轉換結果僅為近似。
  • 遞歸深度**:整數部分深度 ≈ log₂(n),小數部分深度 ≈ 有效位數,均極淺,無棧溢出風險。

非遞歸迭代版(生產代碼推薦)


void printIntPartIter(int n) {
    char buf[64]; int top = 0;
    if (n == 0) { putchar('0'); return; }
    while (n) { buf[top++] = '0' + n % BASE; n /= BASE; }
    while (top--) putchar(buf[top]);
}

void printFracPartIter(double f, int maxDigits) {
    while (f > EPS && maxDigits--) {
        f *= BASE;
        int d = (int)f;
        putchar('0' + d);
        f -= d;
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved