簡體   English   中英

C語言中的printf如何舍入浮點數?

[英]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.

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