根据Oracle余数( n2,n1)函数(01/server.102/b14200/functions133.htm)的文档,余数(n2,n1)函数的计算结果为=n2- n1 *N,其中N=圆形(N2/ n1 ),n1= 0。
因此,我预计余数(10,4)将使用上面记录的计算余数的方法返回-2,如下所示:
REMAINDER(10,4)
=10 - 4 * N where N = ROUND(10/4)
=10 - 4 * 3 since ROUND(10/4) = 3
=10 - 12
=-2但是,在Oracle 10g、11g和12c中运行余数(10,4)将返回2而不是-2。
请有人解释一下,为什么剩余部分(10,4)没有按照oracle如何评估剩余部分的记录方法进行计算?
附加信息:这种行为发生在其他每一个n2中,其中n2是n1 / 2的倍数。可以通过运行下面的SQL来验证它,其中每个余数函数值都应该与它旁边的值匹配。但是它只匹配n2的所有其他值。运行SQL:
select
remainder(2,4), 2-4*round(2/4),--OUTPUT:2, -2
remainder(6,4),6-4*round(6/4), --OUTPUT: -2, -2
remainder(10,4),10-4*round(10/4),--OUTPUT: 2, -2
remainder(14,4),14-4*round(14/4)--OUTPUT: -2, -2
from dual 发布于 2017-01-13 00:38:26
编写文档的人(他们似乎不记得算术中的某些定义)自己似乎不确定他们写了什么。一方面,在解释的早期,他们确实提到了ROUND,但后来当他们给出一个更正式的定义时,他们说
·如果n1 != 0,则余数为n2 - (n1*N),其中N是最接近n2/n1的整数。
“整数最近”不是在算术中正式定义的,事实上,除x的分数部分正好为0.5时,还允许使用整数(X)的名称,在这种情况下,“整数最近的”是模棱两可的,人们可以选择使用“整数最近的整数”作为自己的“整数最近”的定义。
如果可以的话,不要对文档中的这些不一致之处感到太不高兴。你会看到更多。
然而,,:更糟糕的是,行为是不一致的。我使用Oracle12.1,在我的机器上我尝试了
remainder(10, 4) = 2
remainder( 6, 4) = -2没有韵律也没有理由。更好的做法是自己划分,使用地板之类的。
编辑--或者可能有一些原因;也许他们使用“最近的整数”的定义来表示,在领带的情况下,最接近的甚至整数。仍然会产生意外的结果,最好不要使用Oracle的RE余物()函数。
https://stackoverflow.com/questions/41625194
复制相似问题