2010-06-21 438 views
6

我有一個問題,我需要存儲在android homed sqlite數據庫中的double值。因爲這些double值代表gps值(lat & lng),所以我確實NEED的絕對精度降到了逗號後面的第9個數字。在SQLite中存儲雙精度值:如何確保精度?

現在我有像這樣的表:

CREATE TABLE x REAL lng; 

和插入某物(硬編碼)等:

INSERT INTO x lng = '1.0'; 

並從該表中讀取LNG時成一些(JAVA)雙變量,我得到像「0.999956837」這樣的值 - 這使得這些值對我來說毫無用處。

有沒有一種方法來強制我需要的精度,而不是將值存儲爲「文本」字段(什麼會使昂貴的強制轉換需要)或將它們存儲爲整數(這意味着我需要在每次寫入/讀取時相乘/ -OP)?

+0

只是好奇,它是否表現出相同的行爲,如果你使用INSERT INTO x lng = 1.0而不是INSERT INTO x lng ='1.0'',即沒有引號? – Joubarc 2010-06-21 13:12:16

+0

yeas - 我使用引號... – xenonite 2010-06-22 06:57:03

回答

13

SQLite是typeless,這意味着所有的表示形式都被寫成文本,可能包裝器api會做一些你不知道的轉換,你會得到這些結果。

如果您需要將數據存儲爲字符串那就做吧。

正當您讀出兩次請確保以正確的格式保存時,您可以在列上使用getDouble

+0

如果要將數字作爲字符串存儲,則必須聲明沒有類型或文本關聯(「TEXT」,「CHAR」或「CLOB」)的列。否則,無論如何,你的字符串將被轉換爲雙打。 但是,對於少於15位有效數字的非貨幣數據,'double'就足夠了。 – dan04 2010-06-22 00:07:10

+2

好 - 我發現了這個問題......這是我自己的錯 - 我用「Cursor.getInt()」而不是getDouble() - 項目開始的一箇舊的遺蹟:( – xenonite 2010-06-22 06:58:37

4

double大約有17個十進制數字的精度,所以如果9位數是你需要的,應該沒有問題(假設你沒有對這些值做任何複雜的計算)。只要確保你永遠不會使用float,因爲它只有大約7位數的精度。

你還應該確保你瞭解how binary floating-point works,並且它將總是結果看似「圓」的價值觀成爲微客 - 它只是因爲它在某處happes不要緊對於大多數應用(包括你)只要十七進制數字。看到這個鏈接也適用於其重要的應用程序的替代品。