Xquery xdmp:eval为不同的ML版本返回不同的结果

Xquery xdmp:eval为不同的ML版本返回不同的结果,xquery,marklogic,Xquery,Marklogic,在ML9.0-8版本中,表达式xdmp:eval(“(3298534883328)div1024div1024”)返回0。 然而,在ML9.0-7中,相同的表达式返回3072 类似地,在ML9.0-8版本表达式中xdmp:eval((3298534883328)div 1024”)返回32212282,但在ML9.0-7版本中,相同的表达式返回322225472 为什么不同版本的3072会有差异?看来xs:decimal除法返回的结果不正确。这是一个非常大的数字,所以我猜这是某种溢出的结果 以下

在ML9.0-8版本中,表达式
xdmp:eval(“(3298534883328)div1024div1024”)
返回0。 然而,在ML9.0-7中,相同的表达式返回3072

类似地,在ML9.0-8版本表达式中
xdmp:eval((3298534883328)div 1024”)
返回32212282,但在ML9.0-7版本中,相同的表达式返回322225472


为什么不同版本的3072会有差异?

看来
xs:decimal
除法返回的结果不正确。这是一个非常大的数字,所以我猜这是某种溢出的结果

以下每个表达式在MarkLogic的更高版本中生成
xs:decimal
322122382.27274584
,而不是在早期版本中返回的
322225472

3298534883328 div 1024 ,
xs:integer(3298534883328) div 1024,
xs:decimal(3298534883328) div 1024,
xs:long(3298534883328) div 1024  
作为一种解决方法,您可以通过使用、
xs:double()
xs:float()
将左手或右手数字显式计算为
xs:double
xs:float()来强制实现预期值

以下各项均返回预期答案
3072

fn:number(3298534883328) div 1024 div 1024 div 1024,
xs:numeric(3298534883328) div 1024 div 1024 div 1024,
xs:double(3298534883328) div 1024 div 1024 div 1024,
xs:float(3298534883328) div 1024 div 1024 div 1024,

3298534883328 div fn:number(1024) div 1024 div 1024,
3298534883328 div xs:numeric(1024) div 1024 div 1024,
3298534883328 div xs:double(1024) div 1024 div 1024,
3298534883328 div xs:float(1024) div 1024 div 1024

此问题在9.0.9及更高版本中得到解决。如果升级,则不需要任何解决方法。