Xquery xdmp:eval为不同的ML版本返回不同的结果
在ML9.0-8版本中,表达式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除法返回的结果不正确。这是一个非常大的数字,所以我猜这是某种溢出的结果 以下
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及更高版本中得到解决。如果升级,则不需要任何解决方法。