例如,我想打印一個c值最多2位小數,而不是將其舍入。如何在沒有舍入的情況下將浮點值打印到小數點後2位
喜歡:
a = 91.827345;
printf("%.2f", a);
將打印91.83
,但我想輸出只有91.82
。怎麼做?
例如,我想打印一個c值最多2位小數,而不是將其舍入。如何在沒有舍入的情況下將浮點值打印到小數點後2位
喜歡:
a = 91.827345;
printf("%.2f", a);
將打印91.83
,但我想輸出只有91.82
。怎麼做?
執行此操作的唯一簡單方法是使用snprintf
打印到足夠長的緩衝區,以保存整個精確值,然後將其截斷爲字符串。喜歡的東西:
char buf[2*(DBL_MANT_DIG + DBL_MAX_EXP)];
snprintf(buf, sizeof buf, "%.*f", (int)sizeof buf, x);
char *p = strchr(buf, '.'); // beware locale-specific radix char, though!
p[2+1] = 0;
puts(buf);
唉!所以我的評論是正確的:),包含哪些文件用於'DBL_MANT_DIG'和'DBL_MAX_EXP'?爲什麼乘以'2',它應該是'buf [2 *(DBL_MANT_DIG + DBL_MAX_EXP)+ 1]'nul-symbol? –
'#include
順便說一下,大小的限制比它需要的大一點,但不是數量級,除非你想添加更多的邏輯。最小的浮點數確實需要小數點後面的'DBL_MANT_DIG-DBL_MIN_EXP'(可能是一個一個地方)才能精確打印,但由於需要的地方數是兩個,所以可以將小數值直接縮寫爲「0.00」,並且只處理大於相當大的閾值的值,將小數點後的位數減少到'DBL_MANT_DIG'加上一個小常數。 –
我建議更短,更快的方法:
printf("%.2f", ((signed long)(fVal * 100) * 0.01f));
這樣你就不會溢出INT,加上乘以100不應該影響尾數/尾數本身,因爲唯一真正改變的是指數。
這不起作用。乘以100是有損的並且引入舍入步驟。如果'fVal'大於'INT_MAX/100',它也會失敗。 –
打個字符串,然後打印 –
明確重複 –