2016-09-14 48 views
0

为何在CGPoint的极坐标时无法获得精确读数?CGPoint读数在极限坐标500,000,000处不准确

例如,如果为(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)") 

所有结果将读出为5亿和值不能储存以备将来使用,因为它是不准确的。

我必须缺少一些东西。

+2

32位或64位平台?在32位平台上,CGFloat是Float,只有约6位有效数字。 - 你真的必须将数字转换为字符串并返回吗? –

+0

[为什么浮点数的分辨率从原点进一步下降?](http://gamedev.stackexchange.com/q/23848) –

+0

Martin R:你说得对,我想将数值存储在数据库中作为字符串但可以使用数字来代替,但是如果我尝试将coordinates.x转换为Int或任何其他数字类型,则通过几点不准确。即:Int(coordinates.x)将返回500000256而不是500000250.我显然不明白数字类型是如何工作的,因此需要进行更多的挖掘。 – Silverstar

回答

2

CGPoint对x和y坐标使用CGFloat

在32位平台CGFloat是类型Float,它有大约6位有效数字。在你的情况下,最后三位数字被四舍五入。

如果您转移到64位平台CGFloat是类型Double它至少有15位有效数字。

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

+0

感谢大卫的帮助! – Silverstar