首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解Oracle中剩余()函数的行为

理解Oracle中剩余()函数的行为
EN

Stack Overflow用户
提问于 2017-01-12 23:59:14
回答 1查看 206关注 0票数 1

根据Oracle余数( n2,n1)函数(01/server.102/b14200/functions133.htm)的文档,余数(n2,n1)函数的计算结果为=n2- n1 *N,其中N=圆形(N2/ n1 ),n1= 0。

因此,我预计余数(10,4)将使用上面记录的计算余数的方法返回-2,如下所示:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-13 00:38:26

编写文档的人(他们似乎不记得算术中的某些定义)自己似乎不确定他们写了什么。一方面,在解释的早期,他们确实提到了ROUND,但后来当他们给出一个更正式的定义时,他们说

·如果n1 != 0,则余数为n2 - (n1*N),其中N是最接近n2/n1的整数。

“整数最近”不是在算术中正式定义的,事实上,除x的分数部分正好为0.5时,还允许使用整数(X)的名称,在这种情况下,“整数最近的”是模棱两可的,人们可以选择使用“整数最近的整数”作为自己的“整数最近”的定义。

如果可以的话,不要对文档中的这些不一致之处感到太不高兴。你会看到更多。

然而,:更糟糕的是,行为是不一致的。我使用Oracle12.1,在我的机器上我尝试了

代码语言:javascript
运行
复制
remainder(10, 4) =  2
remainder( 6, 4) = -2

没有韵律也没有理由。更好的做法是自己划分,使用地板之类的。

编辑--或者可能有一些原因;也许他们使用“最近的整数”的定义来表示,在领带的情况下,最接近的甚至整数。仍然会产生意外的结果,最好不要使用Oracle的RE余物()函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41625194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档