在甲骨文余()功能的认识行为(Understanding behavior of remainder

2019-09-30 12:15发布

根据用于其余Oracle文档(N2,N1)函数( https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions133.htm ),余数(N2,N1)函数的计算结果为= N2 - N1 * N,其中N = ROUND(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)不被评估为每甲骨文如何评估剩余的记录方法?

其他信息:此行为发生每隔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 

Answer 1:

谁写的文档的人(谁似乎不记得从算术一些定义)本身似乎不确定他们写什么。 在一方面,在解释早期他们提ROUND -但后来当他们给他们说一个更正式的定义

•如果N 1 = 0,则余数为n2 - (N1 * N),其中N是整数最近的N2 / N1

“整数最接近”不是正式算术定义的,并且确实一个被允许使用该名称为圆形(X)除了当x的分数部分正好是0.5,在这种情况下“整数最近的”是不明确的,一个可能选择用“四舍五入”作为自己的定义“整数最接近。”

如果你能做到不获得与文档中的这种不一致太难过。 你会看到更多。

但是什么是更糟糕的是,行为是不一致的。 我使用Oracle 12.1,和我的机器上我只是想和我得到

remainder(10, 4) =  2
remainder( 6, 4) = -2

没有无缘无故。 更好的做自己的分工,利用地面和这样的。

编辑 -或者,也许有一些道理; 也许他们使用“最接近的整数”的定义是指,以平局,最近的偶数的情况。 仍在生产意想不到的效果,最好不要用Oracle的余数()函数。



文章来源: Understanding behavior of remainder() function in Oracle