xml – XSLT 1.0中的数字舍入和精度问题
发布时间:2020-12-16 07:44:04 所属栏目:百科 来源:网络整理
导读:我使用xsl时有不一致, 这里是xml, Rate TotalRate506.41/TotalRate TotalTax17/TotalTax CurrencyINR/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=
我使用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没有四舍五入?
在XSLT 1.0中,使用双重类型实现数字,并且与任何二进制浮点类型一样,精度损失.
在XSLT 2.0 / XPath 2.0中,可以使用xs:decimal类型在不损失精度的情况下工作. I. XSLT 1.0解决方案: 使用 <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,$pPrec2)) )"/> </TotalAmount> </xsl:template> </xsl:stylesheet> 当将此转换应用于提供的XML文档时,将生成两个结果,精度为2,精度为13: <TotalAmount>523.41</TotalAmount> <TotalAmount>523.4100000000001</TotalAmount> II. XSLT 2.0解决方案使用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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |