2013-10-24 44 views

回答

1

執行此操作的唯一簡單方法是使用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); 
+0

唉!所以我的評論是正確的:),包含哪些文件用於'DBL_MANT_DIG'和'DBL_MAX_EXP'?爲什麼乘以'2',它應該是'buf [2 *(DBL_MANT_DIG + DBL_MAX_EXP)+ 1]'nul-symbol? –

+1

'#include ' –

+1

順便說一下,大小的限制比它需要的大一點,但不是數量級,除非你想添加更多的邏輯。最小的浮點數確實需要小數點後面的'DBL_MANT_DIG-DBL_MIN_EXP'(可能是一個一個地方)才能精確打印,但由於需要的地方數是兩個,所以可以將小數值直接縮寫爲「0.00」,並且只處理大於相當大的閾值的值,將小數點後的位數減少到'DBL_MANT_DIG'加上一個小常數。 –

1

我建議更短,更快的方法:

printf("%.2f", ((signed long)(fVal * 100) * 0.01f)); 

這樣你就不會溢出INT,加上乘以100不應該影響尾數/尾數本身,因爲唯一真正改變的是指數。

+2

這不起作用。乘以100是有損的並且引入舍入步驟。如果'fVal'大於'INT_MAX/100',它也會失敗。 –

相關問題