我正在处理一个添加以下数字的查询,并且它会返回一个令人费解的结果。
getGrayscale
我已经尝试了我能想到的所有内容,例如将值转换为不同的数据类型,但我仍然得到相同的结果。
当我将步骤分开时,它会返回正确的答案,但由于某种原因,我无法通过两个相关的步骤来协同工作。
>SELECT ((36.7300 - 20.4300) - 16.3) AS Amount;
>-3.5527136788005e-15
答案 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”)。因此,它们使用最接近的二进制来近似 号码可用。这种近似通常非常接近,但它 将稍微关闭,在某些情况下可能会导致您的结果 与你的期望差别不大。
没有直接解决方案,但有几种解决方法可以解决这个问题:
这取决于您要对数据做什么。例如,如果您管理货币,您可以以美分而不是美元存储您的金额,但如果您存储科学数据,此解决方案远非有效,您可能需要检索操作数并从SQLite中计算结果。