簡體   English   中英

printf 中的填充(浮點數)

[英]padding in printf (float)

我想在模擬器的標題欄中顯示名稱、速度% 和幀速率,例如

<name> 100.00% 50.000fps

問題是, speed通常略低於或略高於 100%,使其左右跳躍。

我知道我可以填充“零”

"%s at %05.2f%% speed, %05.3f fps"

但是前導零(如099.89% )看起來真的很愚蠢。

此外,帶有空格的默認填充也無濟於事,因為顯然空格與數字的寬度不同,因此它也會跳躍。

這甚至可能(不使用某些固定(等寬)字體)嗎?

這甚至可能(不使用某些固定(等寬)字體)嗎?

嚴格來說,不,不是。 然而,雖然空格字符和數字之間的寬度差異通常相當大,但數字之間的寬度差異通常要小得多

因此,您可以根據顯示的值的大小,通過更改小數位數 (DP) 來顯着減少“跳躍”:“100.0”為 1 個 DP,“42.42”為 2 個 DP,“42.42”為 3 個 DP對於小於 10 的值。使用 Stack Overflow (proportional) 字體,如下所示:

100.0
42.42
1.234

要在printf function 中實現這一點,您可以使用固定寬度說明符,其精度取決於值的以 10 為底的對數,使用*說明符將后者作為參數傳遞給printf格式。

這是一個演示:

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

#define max(a,b)  (((a) > (b)) ? (a) : (b))

int main()
{
    double a = 112.345;
    while (a > 0.0) {
        printf("%5.*lf\n", max(0, 3 - (int)log10(max(1.0, a))), a);
        a -= 12.345;
    }
    return 0;
}

Output:

112.3
100.0
87.66
75.31
62.97
50.62
38.28
25.93
13.59
1.240


正如評論中所指出的,上述解決方案在某些“邊緣情況”中會出現問題; 例如,當a = 99.999時, log10 100.0將返回1.9999996左右的值,因此計算的 DP 數將為 2,但100.00值將四舍五入為100的 0.00 0.0.0。

解決此問題的方法是提供自定義ilog10 function,並使用它來確定 DP 的數量。 例如:

#include <stdio.h>

static inline int ilog10(double x)
{
    int answer = 0;
    x += 0.5;
    while ((x /= 10) > 1.0 && answer < 3) ++answer;
    return answer;
}

int main()
{
    double a = 112.345;
    while (a > 0.0) {
        printf("%5.*lf\n", 3 - ilog10(a), a);
        a -= 12.345;
    }
    return 0;
}

請注意,使用此自定義 function,我們可以省去<math.h> header 和max宏的定義/使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM