【发布时间】:2015-03-31 14:56:42
【问题描述】:
XQuery 与 XSLT 和 XPath 2.0 及更高版本共享,支持各种数字数据类型,其中两个是 xs:double 和 xs:decimal。可以将xs:double 转换为xs:decimal,如http://www.w3.org/TR/xquery-operators/#casting-to-numerics 中所定义。
在 Java 中完成的实现似乎使用 Java 的 double 数据类型实现 xs:double,使用 java.math.BigDecimal 类实现 xs:decimal。该类支持两种将double 转换为BigDecimal 的方法,即BigDecimal.valueOf(doubleValue) 和new BigDecimal(doubleValue)。根据https://stackoverflow.com/a/7186298/252228,前者给出更直观的结果,而后者给出更正确的结果,例如BigDecimal.valueOf(1.1)导致1.1,而new BigDecimal(1.1)导致1.100000000000000088817841970012523233890533447265625。
当我尝试使用 Saxon 和 Exist 将 xs:double 转换为 xs:decimal 时
xquery version "1.0";
let $d1 as xs:double := 1.1E0
return xs:decimal($d1)
输出1.100000000000000088817841970012523233890533447265625,而使用BaseX它输出1.1。我想差异是由不同的实现造成的,BaseX 做BigDecimal.valueOf(1.1),Saxon 和 Exist 做new BigDecimal(1.1)。
我的问题是:根据http://www.w3.org/TR/xquery-operators/#casting-to-numerics,哪种方法是实现强制转换操作的正确方法?
【问题讨论】:
-
我想说任何一种方式都是正确的,而且所有的实现都正确地实现了规范。它说有
If ST is xs:float or xs:double, then TV is the xs:decimal value, within the set of xs:decimal values that the implementation is capable of representing, that is numerically closest to SV,我会说两者都返回处理器能够处理的数字上最接近的值。
标签: java xquery saxon exist-db basex