2013-04-21 62 views
3

我想將一個浮點數向下舍入,這樣我就可以得到0.5到7之間的任意數字(帶有任意數量的小數),同時舍入小於0.5的任何數字到0.5。在目標C/Cocoa Touch中向下舍入到最接近的0.5浮點數

例如,

0.1, 0.11442, 0.46 would all be 0.5. 
1.1, 1.43, 1.35 would all be 1. 
1.56, 1.6, 1.8 would all be 1.5. 

任何超過5進行向下取整至5

最終數據集我想是0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5

我不知道任何圍繞Objective C捨去的函數,而不是整數。

回答

23

floor()將向下舍入到下一個整數的浮點數。如果你先乘以2,然後除以2,你會得到期望的結果。

float rounded = value < 0.5f ? 0.5f : floorf(value * 2)/2; 
+0

你的第一個建議是當場上。你的第二,不是很多。 'floorf' *真的很便宜(平均比7次比較便宜)。 – 2013-04-21 15:04:26

+0

你說得對。但是我並不關心舍入操作,而是附加的浮點操作。然而,我運行一個性能測試,我的第一個簡單建議速度大約是其兩倍。 – DrummerB 2013-04-21 15:22:41

+0

謝謝你。工作過一次 – Biggs 2013-04-21 16:02:54

0

要「舍入到最近」間隔,請添加間隔的一半並截斷到間隔邊界。

四捨五入到最接近的整數即(int) (value + 0.5),但它是一個技巧與0.5邊界 - 增加一半的間隔很容易,但截斷到0.5的邊界不是。

所以最實用的方法是雙數,圓形爲int邊界,然後通過2

劃分的另一種方法來做到這一點是整數和分數部分分開(fraction = value - (int) value;),然後使用簡單的「如果梯子」分開格式化小數部分。 (小心 - 負數可能是一個棘手的問題。)如果您需要繞過一些不規則的邊界,這可能是一個更好的選擇。

0

的第一個評論是好的,但它會跳過零和負值..我5毛錢:

float roundToHalf (float val) 
{ 
    if (val==0) return 0; 
    int sign = fabs(val)/val; 
    return sign * (fabs(val) < 0.5f ? 0.5f : floorf(fabs(val)) * 2/2); 

} 
0

嗯,我注意到,除以(如下圖所示)確定的符號,因爲浮點代數的廢話。在很多系統上它也很慢。

float round_half_f(float val) { 
    short sign = (short)(val/fabs(val)); 
    return floorf(fabs(val)*2.f)/2.f * sign; 
} 

這樣做:

float round_half_f(float val) { 
    short sign = val < 0 ? -1 : 1; 
    return floorf(fabs(val)*2.f)/2.f * sign; 
}