簡體   English   中英

C:舍入浮點數

[英]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 在這種格式中:

  • 最接近 1.24 的可表示值為 1.2400000095367431640625。
  • 最接近 1.25 的可表示值為 1.25。
  • 最接近 1.26 的可表示值為 1.2599999904632568359375。
  • 最接近 1.34 的可表示值為 1.34000003337860107421875。
  • 最接近 1.35 的可表示值為 1.35000002384185791015625。
  • 最接近 1.36 的可表示值為 1.36000001430511474609375。

如果您將printf調用中的%0.1f更改為%.99g .99g ,您的 C 實現可能會向您顯示這些值。

最常用的舍入規則是舍入到最接近的可表示值,如果出現平局,則舍入到具有更低數字的平局值。 這是幾乎總是用於算術運算(尤其是加法、減法、乘法和除法)的規則,因此您的 C 實現可能在計算(float)124/100等時使用它。

在將數字從內部二進制float格式轉換為字符串中的數字時,也經常使用該規則,例如printf (在這種情況下,該規則的使用頻率較低,因為某些轉換軟件未編寫為使用根據此規則始終產生正確結果所需的精度或計算。)您觀察到的 output 與此規則的使用一致:

  • 將 1.2400000095367431640625 四舍五入到小數點后一位得到“1.2”,因為它更接近 1.2 而不是 1.3。
  • 將 1.25 四舍五入到小數點后的一位數字會產生“1.2”,因為 1.2 和 1.3 是並列的,而 1.2 具有偶數位。
  • 將 1.2599999904632568359375 四舍五入到小數點后一位數得到“1.3”,因為它更接近 1.3 而不是 1.2。
  • 將 1.34000003337860107421875 四舍五入到小數點后一位得到“1.3”,因為它更接近 1.3 而不是 1.4。
  • 將 1.35000002384185791015625 四舍五入到小數點后一位得到“1.4”,因為它更接近 1.4 而不是 1.3。
  • 將 1.36000001430511474609375 四舍五入到小數點后一位數得到“1.4”,因為它更接近 1.4 而不是 1.3。

暫無
暫無

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

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