[英]C: Rounding floats
你能解釋一下這段代碼嗎:
printf("Value1: %0.1f \n", (float)124/100); // = 1.2
printf("Value1: %0.1f \n", (float)125/100); // = 1.2
printf("Value1: %0.1f \n", (float)126/100); // = 1.3
printf("\n");
printf("Value2: %0.1f \n", (float)134/100); // = 1.3
printf("Value2: %0.1f \n", (float)135/100); // = 1.4
printf("Value2: %0.1f \n", (float)136/100); // = 1.4
為什么數字 125向下舍入為 1.2 而 135向上舍入為 1.4? 例如,它也會發生在數字 105、115、125、155、165 上。
C 標准沒有完全指定float
格式或如何執行舍入。 今天大多數 C 實現都使用 IEEE-754 binary32 格式來表示float
。 在這種格式中:
如果您將printf
調用中的%0.1f
更改為%.99g
.99g ,您的 C 實現可能會向您顯示這些值。
最常用的舍入規則是舍入到最接近的可表示值,如果出現平局,則舍入到具有更低數字的平局值。 這是幾乎總是用於算術運算(尤其是加法、減法、乘法和除法)的規則,因此您的 C 實現可能在計算(float)124/100
等時使用它。
在將數字從內部二進制float
格式轉換為字符串中的數字時,也經常使用該規則,例如printf
。 (在這種情況下,該規則的使用頻率較低,因為某些轉換軟件未編寫為使用根據此規則始終產生正確結果所需的精度或計算。)您觀察到的 output 與此規則的使用一致:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.