2015-04-02 73 views
2

因爲我注意到FloatCGFloat在32位和64位設備上的行爲不同,這可能會導致錯誤,所以我嘗試用我的項目中的CGFloat替換所有Float值。但我無法想出一個方法將CGfloat的值截斷爲小數點後的兩位數字。如何截斷CGFloat值?

在我的項目中,我有一個函數,下載文件會不斷返回Float值「progress」,指示已下載的文件總數有多少%,通常類似「0.3942183693039206」。在這種情況下,我需要截斷爲「0.39」這樣我就可以做更新到數UI,這裏是我的功能:

func updatePropertiesForPorgress(progress:CGFloat){ 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     let truncated = NSString(format: "%.2f", progress) 
     let float = truncated.floatValue 
     self.progressTileView.rating = CGFloat(float) 
    }) 
} 

它與Float值完全正常的,但如果我通過的進步一個CGFloat值,被截斷的變量將等於「0.00」: enter image description here enter image description here

出於好奇,我試圖複製這種情況在操場上,併成功地做到了。代碼簡單:

var test:CGFloat = 0.3920394829459 
let truncated = NSString(format: "%.2f", test) 
let float = truncated.floatValue 

將取決於「測試」變量是一個FloatCGFloat值具有不同的輸出。如果「測試」是Float值,結果將是0.39,這是正確的,但如果我將其更改爲CGFloat,結果將爲「0.00」。

誰能幫我明白髮生了什麼,並告訴我如何正確地截斷CGFloat值?我試過NSNumberFormatter,但它不工作(現在)。

謝謝!

+0

注意,相同的舍入可以簡單地用'讓浮子=輪來實現(100.0 *浮動(進度))/ 100.0',比較http://stackoverflow.com/questions/28328615/is-there-an-efficient三通至圓-A-float到所述最接近的-百分之一佈局中-SW。 – 2015-04-02 07:09:19

+0

您還應該知道,由於這些類型使用的二進制表示形式,浮點類型Float/Double/CGFloat中沒有一個可以完全表示數字0.39 *。計算結果實際上是0.38999998569488525391,但println()將輸出精度限制爲六位十進制數字。 – 2015-04-02 07:18:31

回答

4

NSString(format:_: ...)接受CVarArgType S:

extension NSString { 
    convenience init(format: NSString, _ args: CVarArgType...) 

但是,由於雨燕1.1,CGFloat本身不符合CVarArgType。當它傳遞到NSString(format:_: ...)時,它將轉換爲NSNumber

所以NSString(format: "%.2f", test)相當於NSString(format: "%.2f", test as NSNumber)。其結果是,%.2f0.00

你應該明確地將其轉換爲Double

NSString(format: "%.2f", Double(test)) 

需要注意的是:作爲雨燕1.2的,因爲CGFloat符合CVarArgType,你的代碼工作原樣。

+0

同樣的問題在這裏http:// stackoverflow。com/questions/25098678 /轉換-int-to-cgfloat-results-in-0-000000,但你的回答更好地解釋了它。不知道我們是否應該重複關閉。 – 2015-04-02 07:03:33