解释为什么(7.8 / 39)= 0.2在where子句中不返回结果

问题描述 投票:0回答:2

所以我知道为什么(7.8 / 39)=。2在SQL的where子句中不返回结果,而ROUND((7.8 / 39),1)=。2会返回结果,但是我不知道如何向与我一起工作的人清楚地解释它,我想向他们提供一些其他的东西,然后我告诉他们这将不会作为他们的where子句的一部分。

谢谢,

Jalal

sql vertica
2个回答
1
投票

这是由于floating point arithmetic。如果您不只是“得到”它,这可能很难解释。

我从哪里开始?整数很容易用CPU理解的位来表示。因此,00000101被解释为5-恰好是5-因为它是2 ^ 2 + 2 ^ 0。

但是,这不适用于数字的小数部分。为了解决这个问题,计算机科学家发明了两种形式的数字。一种是我个人认为的BCD(二进制编码的十进制),但是数据库调用了decimalnumeric。每个数字代表一个数字。您只需要一个数字4位,因此看起来像:

0011    0001    1111     0000     1001
   3       1       .        0        9

这正好代表31.09。只需继续添加位。注意:这是概念性的。确切的实现可能有所不同。

第二种方法是指数表示法。即:xxx * 2 ^ yyy,其中xxx和yyy是整数。例如0.25是1 * 2 ^(-2)。可以精确表示“ 1”和“ -2”。

这对数字的[[近似]]非常有用。问题在于0.25可以精确表示。但是0.24和0.26不能。他们最终涉及一些复杂的数字。 0.2也是如此,这是您要表示的数字。发生的情况是您写了0.2,它表示为0.00110011001(例如)。但是,当您进行计算时,最终为0.00110011000。哦最后一点发生了变化,因此实际上更像是0.19997(实际上,实际上更多的是'9')。值不完全相等。

道德:不要在浮点数上使用相等。这些数字可能看起来相同,但是在小数点后的二进制小数位上有所不同。


0
投票
当我的SELECT VERSION()返回时,我尝试了“ Vertica Analytic Database v9.3.1-0”:
© www.soinside.com 2019 - 2024. All rights reserved.