xslt中的十进制精度

时间:2016-05-23 21:13:23

标签: c# xml xslt

我正在使用XSLT文件来舍入XML中的某些值。因此,这些值应以小数精度等级18(最高18位十进制值)舍入。我尝试使用Altova XMLSpy和Visual Studio进行此操作。在这两种情况下,值都在一定数量的数字后被修剪掉。以下是我的代码:

XML

<DateReceived>20160509</DateReceived>
<CurrentCommitment>0</CurrentCommitment>
<InvestedCapital>1510650</InvestedCapital>
<InsideExpenses>1.4556888888888888888495783095462397857346874356023496</InsideExpenses>
<IEMF>2345.76454</IEMF>

XSLT

<xsl:template match="ROW/InsideExpenses">
    <InsideExpenses>
        <xsl:value-of select="format-number(round(1000000000000000000 * text()) div 1000000000000000000, '#.##################')"/>
    </InsideExpenses>

在Altova XML spy的情况下,标签InsideExpenses中的值为1.4556888888888888,而在Visual Studio中,它的值为1.45568888888889(小数点后1位,最后9位)。知道为什么会发生这种情况会很有帮助,如何将数字四舍五入到小数点后18位。

1 个答案:

答案 0 :(得分:2)

首先,您需要清楚XSLT 2.0和1.0之间的差异。 XSLT 2.0(在Altova中实现,但并不意味着您正在使用它)支持xs:double和xs:十进制数字数据类型。 XSLT 1.0仅支持双精度浮点(xs:double)。

对于浮点,如果结果不能精确地以十进制表示,或者精度超过约15位,则算术将始终产生舍入误差。使用xs:decimal,实现可能支持无限精度,在这种情况下十进制结果将是精确的,或者它可能支持固定的精度,因此可以舍入。

因此,如果您想要数字运算的18位精度,那么您确实需要使用XSLT 2.0和xs:decimal数据类型。