首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言十進制轉二進制:負數與小數精確處理

     編輯:程式設計疑難解答

問題描述

輸入十進制數(如 -14.48、61.3585),要求輸出二進制表示(如 -1110.0111101011、111101.0101101111)。原代碼存在負數處理錯誤、小數精度不足、整數部分遞歸邏輯缺陷等問題。

核心難點分析

  1. 負數處理:需先輸出負號,再轉換絕對值。
  2. 整數部分:遞歸除 2 取餘,注意 0 和 1 的基本情況。
  3. 小數部分:乘 2 取整,需限制位數避免無限循環(如 0.1 十進制在二進制中無限循環)。
  4. 精度控制:float 型精度約 6-7 位有效數字,雙精度更佳。

修正後完整代碼

#include <stdio.h>
#include <math.h> // 用於 fabs()

// 整數部分遞歸轉二進制
void printIntBinary(int n) {
    if (n > 1) {
        printIntBinary(n / 2);
    }
    printf("%d", n % 2);
}

// 小數部分迭代轉二進制,限制位數
void printFracBinary(double frac, int maxBits) {
    if (maxBits <= 0 || frac == 0.0) return;
    
    frac *= 2;
    int bit = (int)frac;
    printf("%d", bit);
    printFracBinary(frac - bit, maxBits - 1);
}

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

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

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

    // 輸出整數部分
    if (intPart == 0) {
        printf("0");
    } else {
        printIntBinary(intPart);
    }

    // 輸出小數部分
    if (fracPart > 1e-10) { // 避免浮點誤差
        printf(".");
        printFracBinary(fracPart, 16); // 輸出 16 位小數
    }
    printf("\n");
    return 0;
}

關鍵修正點解析

原代碼問題修正方案
負數直接轉換導致錯誤輸出先輸出 '-', 再處理絕對值
z21 遞歸參數 c 固定,精度不可控增加 maxBits 參數控制小數位數
float 精度不足導致誤差累積改用 double 類型
整數部分遞歸基礎情況缺失明確 n<=1 時直接輸出
未處理 0.0 輸入情況顯式判斷 intPart==0 輸出 "0"

運行示例

輸入: 61.3585
輸出: 111101.01011011100010

輸入: -14.48
輸出: -1110.01111010111000

註:小數部分因二進制無法精確表示某些十進制小數,尾部會有微小誤差,屬正常現象。

進階優化建議

  • 使用 long double 提高精度(視編譯器支持)。
  • 採用定點數算法或任意精度庫(如 GMP)處理極高精度需求。
  • 輸出格式化:補齊整數位寬度、小數位四捨五入等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved