XSLT format-number()函数有大量问题

时间:2015-07-03 07:26:06

标签: java xslt

<xsl:value-of select="format-number(12345678911234567891,'0')"/> 

结果给出了12345678911234570640而不是12345678911234567891。

适用于最多15位数的数字。

<xsl:value-of select="format-number(999999999999999,'0')"/>

结果确切地给出了999999999999999。

为什么数字会改变?显示它的解决方案是什么?

3 个答案:

答案 0 :(得分:1)

当您使用Java时,您可以考虑转移到Saxon 9作为XSLT 2.0处理器并在XSLT / XPath 2.0中使用xs:decimal类型支持:

<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:template match="data">
      <xsl:value-of select="format-number(xs:decimal(.), '0')"/>
  </xsl:template>

</xsl:transform>

输入为

<data>12345678911234567891</data>

输出12345678911234567891

答案 1 :(得分:1)

首先,这取决于您使用的是XSLT 1.0还是2.0。

XSLT 1.0只有一个数字类型(双精度浮点),这不能精确地表示你的长整数。

在XSLT 2.0中,您的值是一个整数,并且所有实现都需要支持最多18位的整数。您的整数有20位数字,因此您可能仍会看到实现之间存在一些差异。

Saxon处理&#34;无限制&#34;的整数。大小(也就是说,在抱怨整数有太多数字之前,你可能会耗尽内存)。

答案 2 :(得分:0)

这是由于浮点舍入。 IEEE754浮点双精度不能区分这两个数字。

add_theme_support( 'post-thumbnails', array( 'post' ) ); // Add it for posts add_theme_support( 'post-thumbnails', array( 'page' ) ); // Add it for pages 完全以浮点表示的那个,因此是你得到的那个。

15个有效数字是浮点数加倍的准确度限制,这就是为什么它在这种情况下有效。