[英]Why does printf("%.6g, <value>) ignore zeroes after decimal point?
[英]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.