在SQLite中存储双精度值:如何确保精度?

问题描述:

我有一个问题,我需要存储在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

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

double大约有17个十进制数字的精度,所以如果9位数是你需要的,应该没有问题(假设你没有对这些值做任何复杂的计算)。只要确保你永远不会使用float,因为它只有大约7位数的精度。

你还应该确保你了解how binary floating-point works,并且它将总是结果看似“圆”的价值观成为微客 - 它只是因为它在某处happes不要紧对于大多数应用(包括你)只要十七进制数字。看到这个链接也适用于其重要的应用程序的替代品。