如何截断CGFloat值?

因为我注意到FloatCGFloat在32位和64位设备上表现不同,这可能导致错误,我尝试在我的项目中用CGFloat替换所有Float值。 但是,我无法找到一种方法将CGfloat值截断为小数点后的2位数。

在我的项目中,我有一个函数,下载文件不断返回Float值“progress”,表示已经下载了多少百分比的文件,通常类似于“0.3942183693039206”。 在这种情况下,我需要将数字截断为“0.39”,以便我可以更新UI,这是我的function:

  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”: 在此处输入图像描述在此处输入图像描述

出于好奇,我试图在操场上复制这种情况,并成功地做到了。 代码简单如下:

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

将具有不同的输出,具体取决于“test”变量是FloatCGFloat值。 如果“test”是Float值,结果将是0.39,这是正确的,但如果我将其更改为CGFloat ,结果将为“0.00”。

任何人都可以帮助我了解正在发生的事情,并告诉我如何正确截断CGFloat值? 我尝试过NSNumberFormatter但它没有用(现在)。

谢谢!

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

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

但是,从Swift 1.1开始, CGFloat本身并不符合CVarArgType 。 当它传递给NSString(format:_: ...) ,它将转换为NSNumber

所以NSString(format: "%.2f", test)等同于NSString(format: "%.2f", test as NSNumber) 。 结果, %.2f将为0.00

您应该将其显式转换为Double

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

请注意:从Swift 1.2开始,由于CGFloat符合CVarArgType ,因此您的代码可以正常工作。