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

C 語言十進制轉二進制:精度限制與輸出格式說明

     編輯:程式設計疑難解答

問題核心

用戶期望輸入 61.3585 輸出完整二進制,但 float 型只有約 6-7 位十進制有效數字,double 約 15-16 位。二進制小數位數遠超十進制精度,無法「精確」還原所有位。

精度對照表

類型位數十進制有效位二進制小數大約可精確位數
float32~7~23
double64~15~52
long double80/128~19/~34~63/~112

實際運行現象解釋

輸入: 61.3585
float 存儲實際值: 61.358499... (已丟失精度)
輸出二進制: 111101.01011011... (後續位數為儲存近似值的二進制展開)

正確預期管理

  1. 指定輸出位數:如「輸出小數點後 10/16/20 位」。
  2. 使用 double:主流編譯器下精度足夠大多數場景。
  3. 理解「精確」定義:十進制有限小數(如 0.1)在二進制中往往是無限循環,計算機只能存儲近似值。

改進代碼模板(含精度控制)

#include <stdio.h>
#include <math.h>

void printBinary(double num, int fracBits) {
    if (num < 0) { printf("-"); num = -num; }
    
    long long intPart = (long long)num;
    double fracPart = num - intPart;
    
    // 整數部分
    if (intPart == 0) printf("0");
    else {
        char buf[64];
        int idx = 0;
        while (intPart > 0) {
            buf[idx++] = '0' + (intPart & 1);
            intPart >>= 1;
        }
        while (idx--) putchar(buf[idx]);
    }
    
    // 小數部分
    if (fracPart > 1e-12) {
        printf(".");
        for (int i = 0; i < fracBits && fracPart > 1e-12; i++) {
            fracPart *= 2;
            int bit = (int)fracPart;
            putchar('0' + bit);
            fracPart -= bit;
        }
    }
    printf("\n");
}

int main() {
    double x;
    printf("輸入數字: ");
    scanf("%lf", &x);
    printBinary(x, 20); // 指定輸出 20 位小數
    return 0;
}

總結

「結果不對」多半是 精度預期不匹配。浮點數轉二進制本質是 近似值的近似展開。明確指定 double 類型、限定輸出小數位數、理解精度邊界,才是工程正確態度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved