2011-07-25 30 views
3

我無法使用通用0.5規則舍入浮點數。
讓我們準確的...我怎麼可能做出這樣的輪:使用0.5規則舍入浮點數的方法

  • x.x2 - > XX
  • x.x5 - > XX(或x.x中+ 1也將是不錯的)
  • x.x6 - > x.x中+ 1

因此,例如:

  • 1.12 - > 1.1
  • 1.22 - > 1.2

  • 1.15 - > 1.1(或1.2 woudl也不錯)

  • 1.25 - > 1.2(或1.3 woudl也不錯)

  • 1.16 - > 1.2

  • 1.26 - > 1.3

我想這些方法(可能以錯誤的方式):

  • NSNumberFormatter
  • NSDecimalNumber
  • ...

但是沒有什麼可以給結果。我總是得到一些x.x99999999的結果,或者是非常圓整的結果(過高,過低,或者偶數時,舍入的數字應該出現在上面)。

+0

既然您提到'x.x99999999'的結果,您可以嘗試使用'%.1f'格式化程序來處理'printf'。 –

+1

邁克說什麼;這聽起來像是經典的「浮點數是基於2而不是基於10」的問題。 – Wevah

+1

順便說一句,「當圓整數字應該出現在上一個數字上時的偶數」是通常的做法,因此舍入不會導致一系列數字平均值的小正移。 (例如,由於x = 0.0不輪,0.0

回答

7

試試這個:

round(x * 10.0f)/10.0f 
0

爲了避免@junjanes的很好的答案溢出,只有操縱x當它有一個小數部分。

float round_tenth(float x) { 

    const float limit = 1.0/FLT_EPSILON; 
    // or limit = FLT_MAX/10.0; 

    if (fabsf(x) < limit) { 
    return roundf(x*10.0f)/10.0f; 
    } 
    return x; 
}