【问题标题】:How to convert large exponential values to integer/decimal format in Marklogic?如何在 Marklogic 中将大指数值转换为整数/十进制格式?
【发布时间】:2021-06-08 13:48:55
【问题描述】:

我有一个指数值,例如3.22122E+23

当我尝试在 Marklogic 中-xs:decimal(3.22122E+23) 我收到此错误:

[1.0-ml] XDMP-CAST: (err:FORG0001) xs:decimal(xs:double("3.22122E23")) -- 无效转换: xs:double("3.22122E23") 转换为 xs:decimal

例如较低的值xs:decimal(3.22122E+18) 给了我正确的结果,即3221220000000000000

我看到这是因为小数溢出,不能表示为十进制数据类型,但是 Marklogic 中有什么方法可以处理和计算如此巨大的值吗?

同样的问题适用于负值 (3.22122E-23),我可以在其中处理和显示小数点后 20 位以上的数据。

【问题讨论】:

    标签: xquery marklogic-9 marklogic-10


    【解决方案1】:

    澄清您正在尝试完成什么样的逻辑或计算以及为什么需要将值转换为十进制会很有帮助。例如,要“显示”双精度值,您可以使用标准的 format-number 函数,而无需任何转换为​​十进制:

    let $x := xs:double(3.22122E+23)
    return format-number($x,"#,##0.00")
    

    产量:

    322,122,000,000,000,000,000,000.00
    

    有关fn:format-number() 用法的详细信息,请参阅https://docs.marklogic.com/fn:format-number

    有关xs:decimal 类型限制的详细信息,请参阅https://help.marklogic.com/Knowledgebase/Article/View/487/0/marklogic-server-and-the-decimal-type-implementation

    【讨论】:

    • 需要以扩展格式显示指数值,但上述解决方案不起作用。它给出了这个错误 - [1.0-ml] XDMP-DECOVRFLW: (err:FOAR0002) fn:format-number(xs:double("3.22122E23"), "#,##0.00") -- 十进制溢出
    • 我可以使用 MarkLogic 重新创建相同的错误。我将让 MarkLogic 专家来评论这是否是 MarkLogic 缺陷。这个错误似乎不是 W3C 规范的预期结果。我在 Saxon、Zorba 和 xidel 处理器中得到了预期的结果。
    • 我已经为此提交了一个 MarkLogic 错误,因为它看起来确实应该工作,但目前没有。
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2015-03-17
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多