使用xsl,
时出现不一致这是xml,
<Rate>
<TotalRate>506.41</TotalRate>
<TotalTax>17</TotalTax>
<Currency>INR</Currency>
</Rate>
和xsl,
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<TotalAmount>
<xsl:value-of select="Rate/TotalRate + Rate/TotalTax"/>
</TotalAmount>
</xsl:template>
</xsl:stylesheet>
,输出为,
<TotalAmount xmlns:fo="http://www.w3.org/1999/XSL/Format">523.4100000000001</TotalAmount>
但预期的o / p是,
<TotalAmount xmlns:fo="http://www.w3.org/1999/XSL/Format">523.41</TotalAmount>
为什么o / p是523.4100000000001?如何在没有四舍五入的情况下获得523.41?
答案 0 :(得分:16)
在XSLT 1.0中,数字是使用 double 类型实现的,与任何二进制浮点类型一样,精度会有所下降。
在XSLT 2.0 / XPath 2.0中,可以使用xs:decimal
类型工作而不会损失精度。
<强>予。 XSLT 1.0解决方案:
使用format-number()
功能:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<TotalAmount>
<xsl:value-of select="format-number(TotalRate + TotalTax, '0.##')"/>
</TotalAmount>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<Rate>
<TotalRate>506.41</TotalRate>
<TotalTax>17</TotalTax>
<Currency>INR</Currency>
</Rate>
产生了想要的正确结果:
<TotalAmount>523.41</TotalAmount>
这里也是一个例子,表明想要的精度可能不是静态知道的,可以作为外部/全局参数传递给转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pPrec" select="2"/>
<xsl:param name="pPrec2" select="13"/>
<xsl:variable name="vPict" select="'##################'"/>
<xsl:template match="/*">
<TotalAmount>
<xsl:value-of select=
"format-number(TotalRate + TotalTax,
concat('0.', substring($vPict,1,$pPrec))
)"/>
</TotalAmount>
<TotalAmount>
<xsl:value-of select=
"format-number(TotalRate + TotalTax,
concat('0.', substring($vPict,1,$pPrec2))
)"/>
</TotalAmount>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时,会生成两个结果 - 精度为2,精度为13 :
<TotalAmount>523.41</TotalAmount>
<TotalAmount>523.4100000000001</TotalAmount>
<强> II。使用xs:decimal
:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<TotalAmount>
<xsl:value-of select="xs:decimal(TotalRate) + xs:decimal(TotalTax)"/>
</TotalAmount>
</xsl:template>
</xsl:stylesheet>
当在同一个XML文档(上面)上应用此转换时,会生成所需的正确结果:
<TotalAmount>523.41</TotalAmount>