2016-09-14 51 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