簡體   English   中英

為什么帶有 %f 的 printf() 有時會在小數點后丟失一位數字?

[英]Why does printf() with %f lose a digit after decimal point sometimes?

為什么聲明

printf("%f", sensorvalue)

大多數時候打印出像“11312.96”這樣的字符串(小數點后兩位),但有時會打印出“11313.1”這樣的字符串(小數點后一位)? 從功率計連續讀取sensorvalue值。 不同時間的值應該具有相同的格式。

它是在 Linux 上運行的 C。

為什么printf("%f", sensorvalue)語句printf("%f", sensorvalue)打印出像 11312.96 這樣的字符串(小數點后兩位),但有時會打印出像 11313.1 這樣的字符串(小數點后一位)?

即使“它是在 Linux 上運行的 C”,該庫也不符合 C。

的輸出

printf("%f\n", 11312.96f);
printf("%f\n", 11312.96);
printf("%f\n", 11313.1f);
printf("%f\n", 11313.1);

... 預計如下所示, '.'后有 6 位數字'.' - 也許在最小位數的值上有一些變化。 即使使用不同質量的實現,輸出也應該是'.'后的6位數字'.' .

11312.959961
11312.960000
11313.099609
11313.100000

如果格式為"%g" ,可能會出現如下輸出。

11313
11313
11313.1
11313.1

如果您完全按照說明使用%f ,這實際上違反了標准(這很不尋常,但肯定不是聞所未聞),該標准在C11 7.21.6.1 The fprintf function /8

F, f:表示浮點數的double參數轉換為[−]ddd.ddd樣式的十進制表示法,其中小數點字符后的位數等於精度規范。 如果缺少精度,則將其視為6

換句話說,這個程序:

#include <stdio.h>
int main() {
    double d1 = 11312.96, d2 = 11313.1;
    printf("%f\n%f\n", d1, d2);
    return 0;
}

應該生成:

11312.960000
11313.100000

如果您希望它具有不同的格式(在您看似不正確的情況下,以及符合標准的情況下),請使用 precision 參數來強制它,例如:

printf("%.2f\n", d1);    // gives "11312.96"

您可能還想指定最小字段寬度以確保您的數字在右側排列,例如:

                          // posn:  123456789
                          //        ---------
printf("%9.2f\n", d1);    // gives " 11312.96"
printf("%9.2f\n", 3.1);   // gives "     3.10"

暫無
暫無

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

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