我有一个双值的问题,我需要存储在android homed sqlite数据库中。由于这些双值代表gps值(lat& lng),我真的NEED
绝对精度,直到逗号后的第9个数字。
现在我有一张这样的表:
CREATE TABLE x REAL lng;
并插入sth(硬编码),如:
INSERT INTO x lng = '1.0';
当从这个表中读取lng到某个(java)双变量时,我得到一个像“0.999956837”这样的值 - 这使得这些值对我来说毫无用处。
有没有办法强制执行我需要的精度,除了将值存储为“文本”字段(什么会使昂贵的演员表成为必要)或将它们存储为整数(意味着我需要在每次写入/读取时乘以/除以 - OP)?
答案 0 :(得分:13)
SQLite是typeless,这意味着所有表示都是以文本形式编写的,可能包装器api做了一些你不知道的转换,你得到了那些结果。
如果您需要将数据存储为字符串,请执行此操作。
当您读出双精确版时,请确保以正确的格式保存,您可以在列上使用getDouble
。
答案 1 :(得分:4)
double
有大约17个十进制数字的精度,所以如果你需要9位数,那么应该没有问题(假设你没有对这些值进行任何复杂的计算)。只要确保你永远不会最终使用float
,因为它只有大约7位精度。
您还应该确保理解how binary floating-point works,并且总是会导致看似“圆”的值稍微偏离 - 这对大多数应用程序(包括您的应用程序)都无关紧要只要它发生在第17个十进制数字的某个地方。请参阅该链接,了解其重要的应用程序的替代方案。