2016-05-23 15 views
1

XMLの特定の値を四捨五入するためにXSLTファイルを使用しています。したがって、これらの値の小数精度レベル18(小数点以下第18桁まで)を四捨五入します。私はこれをAltova XMLSpyとVisual Studioでやってみました。どちらの場合も、値は特定の桁数の後に切り捨てられます。以下は私のコードです:xsltの小数精度

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の場合は、タグInsideExpensesに値をスパイ1.4556888888888888だったとVisual Studioの場合、それは1.45568888888889(1少なかったです小数点以下9桁)。なぜこのようなことが起こっているのかを知ることは大いに役立ち、どうすれば小数点第18位まで数値を丸めることができるでしょうか。

答えて

1

まず、XSLT 2.0と1.0の違いについては、ここで明確にする必要があります。 XSLT 2.0(これはAltovaで実装されていますが、使用しているわけではありません)は、xs:doubleとxs:decimalの両方の数値データ型をサポートしています。 XSLT 1.0は、倍精度浮動小数点(xs:double)のみをサポートしています。

浮動小数点では、結果が正確に10進数で表現できない場合、または精度が約15桁を超える場合、算術演算は常に丸め誤差を生成します。 xs:decimalでは、実装は無限の精度をサポートすることがあります。その場合、10進数の結果は正確になるか、固定精度をサポートして丸められます。

あなたは数値演算のための精度の18桁の数字をしたいのであれば、あなたは本当にXSLT 2.0およびxs使用する必要があります小数点データ・タイプを。

+0

ありがとうございました!私はあなたが提案したことを正確に行い、Altovaで動作しました。しかし、.NETにはネイティブのXSLT 2.0プロセッサはありません。だから私はSaxon/XQSharpなどのサードパーティのプロセッサを使用するか、何とかXSLT 1.0で動作させる必要があります。 –

+1

マイクロソフトはXSLTプロセッサの開発を約15年前にやめ、.NET上に少なくとも3つのXSLTプロセッサがあり、Microsoft製品を凌駕しており、積極的に開発されているため、XSLT 2.0では少なくとも2倍XSLT 1.0の生産性、あなたは本当に前進することについて考える必要があります。 –