【问题标题】:storing double values in SQLite: how to ensure precision?在 SQLite 中存储双精度值:如何确保精度?
【发布时间】:2010-06-21 10:20:16
【问题描述】:

我有一个双值问题,我需要将其存储在一个 android homed sqlite 数据库中。由于这些双精度值代表 gps 值(纬度和 lng),我真的 NEED 绝对精度到逗号后的第 9 个数字。

现在我有一张这样的桌子:

CREATE TABLE x REAL lng;

并插入某物(硬编码),例如:

INSERT INTO x lng = '1.0';

当从这个表中读取 lng 到一些(java)双变量时,我得到一个像“0.999956837”这样的值——这使得这些值对我来说毫无用处。

除了将值存储为“文本”字段(这将使昂贵的强制转换成为必要)或将它们存储为整数(这意味着我需要在每次写入/读取时乘/除-操作)?

【问题讨论】:

  • 只是好奇,如果您使用INSERT INTO x lng = 1.0 而不是INSERT INTO x lng = '1.0'(即不带引号),它会表现出相同的行为吗?

标签: android database sqlite double precision


【解决方案1】:

SQLite 是typeless,这意味着所有的表示都写成文本,可能包装器 api 做了一些你不知道的转换,你得到了那些结果。

如果您需要将数据存储为字符串执行此操作。

当你读出双精度时,确保你以正确的格式保存,你可以在列上使用getDouble

【讨论】:

  • 如果你想将数字存储为字符串,你必须声明没有类型的列,或者使用文本关联(TEXTCHARCLOB)。否则,无论如何,您的字符串都将转换为双精度。但是,对于有效数字少于 15 位的非货币数据,double 就足够了。
  • 好吧 - 我发现了问题......这是我自己的错 - 我使用“Cursor.getInt()”而不是 getDouble() - 项目开始时的旧遗物 :(
【解决方案2】:

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

您还应该确保您理解 how binary floating-point works,并且它总是会导致看似“圆形”的值稍微偏离 - 这对于大多数应用程序(包括您的应用程序)来说根本无关紧要,因为只要它发生在第 17 位十进制数字的某个地方。另请参阅该链接以获取重要应用程序的替代方案。

【讨论】:

    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多