簡體   English   中英

為什么printf(“%。2f”,(double)12.555)返回12.55?

[英]Why does printf(“%.2f”, (double) 12.555) return 12.55?

我正在編寫一個程序,我不得不將其加倍到小數點后第二位。 我注意到printf(“%。2f”,(double)12.555)返回12.55 但是, printf(“%。2f”,(float)12.555)返回12.56 誰能解釋為什么會這樣?

12.555是一個在二進制浮點中無法精確表示的數字。 碰巧的是,在系統上以雙精度浮點表示的最接近1.2555的值略小於1.2555,並且在單精度浮點中可表示的最接近1.2555的值略大於1.2555。

假設轉換使用的舍入模式是舍入到最接近的(與偶數相關),這是IEEE 754標准中的默認值,則可以預期所描述的輸出。

使用IEEE 754表示在內部存儲浮點數和雙精度數。 與您的問題相關的部分是浮點數和雙精度數都存儲最接近它們可以的十進制數,給定其表示的限制。 粗略地說,這些限制與將原始數字的小數部分轉換為具有有限位數的二進制數有關。

事實證明,最接近12.555的浮點數實際上是12.55500030517578125,而最接近12.555的浮點數是12.554999999999999715782905696。 注意double如何提供更高的准確性,但錯誤是負面的。

在這一點上,現在可能很明顯為什么圓函數向上浮動而向下為雙 - 它們都是四舍五入到底層表示的最接近的十進制數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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