SQLite返回不正确的关节点值

时间:2015-05-20 16:24:56

标签: sqlite

我正在处理一个添加以下数字的查询,并且它会返回一个令人费解的结果。

getGrayscale

我已经尝试了我能想到的所有内容,例如将值转换为不同的数据类型,但我仍然得到相同的结果。

当我将步骤分开时,它会返回正确的答案,但由于某种原因,我无法通过两个相关的步骤来协同工作。

>SELECT ((36.7300 - 20.4300) - 16.3) AS Amount;
>-3.5527136788005e-15

1 个答案:

答案 0 :(得分:1)

这是因为SQLite使用二进制算术而不是base-10算法。

来自SQLite FAQ

  

(16)为什么ROUND(9.95,1)返回9.9而不是10.0?不应该向上舍入?

     

SQLite使用二进制算法,在二进制中,没有办法写   9.95有限位数。离你最近的64位IEEE浮点数(这是SQLite使用的)可以达到9.95   9.949999999999999289457264239899814128875732421875。因此,当您键入“9.95”时,SQLite确实理解这个数字要长得多   价值如上所示。而这个价值又下降了。

     

这种问题在处理浮动时总是出现   点二进制数。要记住的一般规则是大多数   十进制中具有有限表示的小数(a.k.a   “base-10”)在二进制中没有有限的表示(a.k.a   “碱-2”)。因此,它们使用最接近的二进制来近似   号码可用。这种近似通常非常接近,但它   将稍微关闭,在某些情况下可能会导致您的结果   与你的期望差别不大。

没有直接解决方案,但有几种解决方法可以解决这个问题:

  • 存储没有小数的金额并计算INTEGER操作
  • 返回您的REAL并从数据库中进行数学计算
  • 将结果从数据库中取出

这取决于您要对数据做什么。例如,如果您管理货币,您可以以美分而不是美元存储您的金额,但如果您存储科学数据,此解决方案远非有效,您可能需要检索操作数并从SQLite中计算结果。