用戶期望輸入 61.3585 輸出完整二進制,但 float 型只有約 6-7 位十進制有效數字,double 約 15-16 位。二進制小數位數遠超十進制精度,無法「精確」還原所有位。
| 類型 | 位數 | 十進制有效位 | 二進制小數大約可精確位數 |
|---|---|---|---|
| float | 32 | ~7 | ~23 |
| double | 64 | ~15 | ~52 |
| long double | 80/128 | ~19/~34 | ~63/~112 |
輸入: 61.3585
float 存儲實際值: 61.358499... (已丟失精度)
輸出二進制: 111101.01011011... (後續位數為儲存近似值的二進制展開)
#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 類型、限定輸出小數位數、理解精度邊界,才是工程正確態度。