gpt4 book ai didi

java - XPath - Java XPath 结果意外

转载 作者:行者123 更新时间:2023-12-01 08:50:48 26 4
gpt4 key购买 nike

我注意到一些奇怪的事情。这是我的 XML

<Items>
<Item>
<Name>A</Name>
<Amount>0.0012</Amount>
<Quantity>17</Quantity>
<TotalAmount>0.0204</TotalAmount>
</Item>
<Item>
<Name>B</Name>
<Amount>1</Amount>
<Quantity>2</Quantity>
<TotalAmount>2</TotalAmount>
</Item>
<Item>
<Name>C</Name>
<Amount>3</Amount>
<Quantity>2</Quantity>
<TotalAmount>6</TotalAmount>
</Item>
</Items>

这是我使用的 XPath

/Items/Item[((Amount * Quantity) != TotalAmount)]/Name

此 XPath 必须打印 TotalAmount!= Product(金额,数量) 的项目名称。

我得到了值A。但我不明白为什么会发生这种情况,因为0.0012 * 17 = 0.0204

如果我删除项目“A”,那么我不会得到结果。

新版本的 XPath 也是如此

for $x in /Items/Item[((Amount * Quantity) != TotalAmount)] return $x/Name

我在 Java 中使用 Saxon 9。

谁能解释一下为什么会发生这种情况。

最佳答案

尝试使用 xs:decimal/xs:integer 以获得更好的精度:/Items/Item[((xs:decimal(Amount) * xs:integer (数量)) != 总金额)]/名称.

如果你看http://xsltransform.net/94AbWBV这确实是

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="/">
<results>
<names-precise>
<xsl:value-of select="/Items/Item[((xs:decimal(Amount) * xs:integer(Quantity)) != TotalAmount)]/Name"/>
</names-precise>
<names-imprecise>
<xsl:value-of select="/Items/Item[((Amount * Quantity) != TotalAmount)]/Name"/>
</names-imprecise>
<xsl:apply-templates/>
</results>

</xsl:template>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="Item">
<xsl:copy>
<xsl:apply-templates/>
<double-computation>
<xsl:value-of select="Amount * Quantity"/>
</double-computation>
<decimal-computation>
<xsl:value-of select="xs:decimal(Amount) * xs:integer(Quantity)"/>
</decimal-computation>
</xsl:copy>
</xsl:template>
</xsl:transform>

您可以看到使用的默认浮点算法不足以计算准确的结果:

<results>
<names-precise/>
<names-imprecise>A</names-imprecise>
<Items>
<Item>
<Name>A</Name>
<Amount>0.0012</Amount>
<Quantity>17</Quantity>
<TotalAmount>0.0204</TotalAmount>
<double-computation>0.020399999999999998</double-computation>
<decimal-computation>0.0204</decimal-computation>
</Item>
<Item>
<Name>B</Name>
<Amount>1</Amount>
<Quantity>2</Quantity>
<TotalAmount>2</TotalAmount>
<double-computation>2</double-computation>
<decimal-computation>2</decimal-computation>
</Item>
<Item>
<Name>C</Name>
<Amount>3</Amount>
<Quantity>2</Quantity>
<TotalAmount>6</TotalAmount>
<double-computation>6</double-computation>
<decimal-computation>6</decimal-computation>
</Item>
</Items>
</results>

其他语言(例如使用 IEEE 双数字格式的 Javascript)也存在同样的不精确性:

document.getElementById('result').textContent = 0.0012 * 17;
<p>Result of <code>0.0012 * 17</code> with Javascript is <code id="result"></code>.</p>

关于java - XPath - Java XPath 结果意外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42421919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com