CGPoint 读数在 500,000,000 的极端坐标处不准确

CGPoint readout inaccurate at extreme coordinates of 500,000,000

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

例如,如果为 (500000250,500000100) 创建的 CGPoint 并且我使用 print(),我只会看到 x 和 y 的“5e+08”。当我使用数字格式化程序(见下文)并将科学记数法转换回小数时,我只得到 500000000 每个 x 和 y 是 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,并且该值不准确,因此无法存储以备将来使用。

我一定是漏了什么。

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

在 32 位平台上 CGFloatFloat 类型,它有大约 6 位有效数字。在您的情况下,最后三位数字四舍五入。

如果您移动到 ​​64 位平台,CGFloat 类型 Double 至少有 15 个有效数字。

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