[英]How does printf in C round floating-point numbers?
我正在嘗試實現printf
,我想知道printf
如何對浮點數進行四舍五入,因為我找不到通用規則
例如,如果輸入=> printf("|%.f| |%.1f| |%.2f| |%.5f| |%.12f", 0.000099, 0.000099, 0.000099, 0.000099, 0.000099);
這是輸出=> |0| |0.0| |0.00| |0.00010| |0.000099000000
|0| |0.0| |0.00| |0.00010| |0.000099000000
我使用的是IEEE-754中的方法,因此內存中的浮點數為: 0.000098999999999999994037755413067714016506215557456016540527343750
我的問題是,何時以及如何對我的浮點數取整?
我正在尋找所有浮點數必須遵循的一般規則。
不知道這是否確實是printf
工作方式,但這似乎適用於您的示例:
加5 /(10 ^(小數點數+1)。然后截斷。
您的解釋有缺陷:您的C編譯器將常量轉換為雙精度。 因此,它不使用0.0000989999....
它在使用更精確的雙精度等效項。
嘗試這個:
printf("|%.f| |%.1f| |%.2f| |%.5f| |%.12f", (float)0.000099, (float)0.000099, (float)0.000099, (float)0.000099, (float)0.000099);
輸出:
| 0 | | 0.0 | | 0.00 | | 0.00010 | | 0.000098999997
您要解決的問題實際上很難正確解決。
許多現有的printf
實現都使用將近30年前由David M. Gay編寫的轉換代碼dtoa.c。
您可以從以下問題中了解有關此問題的更多信息,該問題並非完全相同:
這些網站:
C標准在§7.21.6.1p13中提供了以下內容:
對於
e, E, f, F, g, and G
轉換,如果有效的十進制數字最多為DECIMAL_DIG
,則結果應正確取整。 如果有效的十進制數字位數大於DECIMAL_DIG
但源值可以用DECIMAL_DIG
數字精確表示,則結果應為帶有尾隨零的精確表示形式。 否則,源值由兩個相鄰的十進制字符串L<U
界定,它們都具有DECIMAL_DIG
有效數字; 所得的十進制字符串D
的值應滿足L ≤ D ≤ U
,並另外規定該誤差應具有當前舍入方向的正確符號。
但是,該款屬於“推薦做法”小節的一部分。 (如果附件F有效,則需要推薦的做法。請參閱F.5。)
“正確舍入”由當前舍入方向定義。 參見fsetround
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.