CGPoint读数在极端坐标500,000,000

时间:2016-09-14 19:13:12

标签: swift core-graphics

为什么在CGPoint的极坐标处无法获得准确的读数?

例如,如果为(500000250,500000100)创建的CGPoint和我使用print(),我只看到x和y的“5e + 08”。当我使用数字格式化器(见下文)并将科学记数法转换回小数时,每个x和y只得到500000000,即250和100不同步。

let coordinates = CGPointMake(500000250,500000100)

let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let xCoord = numberFormatter.numberFromString("\(coordinates.x)")
let yCoord = numberFormatter.numberFromString("\(coordinates.y)")

我也试过了:

let decimalValue = NSDecimalNumber(string: "\(coordinates.x)")

所有结果将读作500000000,并且该值无法存储以备将来使用,因为它不准确。

我一定错过了什么。

1 个答案:

答案 0 :(得分:2)

CGPoint使用CGFloat作为x和y坐标。

在32位平台CGFloat上的类型为Float,其中大约有6位有效数字。在您的情况下,最后三位数字将四舍五入。

如果您转移到64位平台CGFloat,则类型Double至少包含15位有效数字。

如果您需要使用15位有效数字进行计算,请在将其传递给Core Graphics时使用Double然后转换为CGFloat。