7

理解できない奇妙な精度の動作に気付きました。XML がいくつかあります。

<CLD>
    <UCRV>
        <UCR1>.07</UCR1>
    </UCRV>
</CLD>

XSLT ファイルでは、次のように値をペンス (または 100 ペンスのように見えますが、理由はわかりませんが、顧客が望んでいるものです!) として選択しています。

<xsl:value-of select="./s0:CLD/s0:UCRV/s0:UCR1/text() * 100 * 100"/>

ただし、これは 700.00000000000011 として出力されます。データ型は xsd:Decimal です。ここでデフォルトの精度が行われていますか? 単純に数値を丸めることができますが、もう少し理解したかっただけです。

ありがとう

4

3 に答える 3

5

浮動小数点数は、すべてを正確に表すことはできません。数値は 2 進数で格納されるため、10 進数で書きやすいと思われる数値が、実際には 2 進数でしか扱えない場合があります。これは 0.07 の場合です。あなたの場合のように、0.070000000000000011 として内部的に保存されます。経験則として、丸めを行わずに直接比較するために、浮動小数点値を信頼するべきではありません。

于 2012-09-18T11:00:44.047 に答える
4

すでに説明したように、XPath で使用される唯一の数値型は xs:doubleです。

このnumber()関数は、値を double に変換します。したがって、XPath 1.0 で数値を操作すると、精度が失われることがあります。

さまざまなソリューションが存在します:

  1. 機能を使用してくださいround()floor()またはceiling()関数を使用することもできます。

  2. XSLT format-number()function() または<xsl:number>命令を使用します。

XPath 2.0 はxs:decimal. 精度が失われない XPath 2.0 式は次のとおりです。

xs:decimal(0.07)*100*100
于 2012-09-18T12:13:20.380 に答える
3

これは標準の浮動小数点演算です。これには、数値に適合する最大ビット数があり、数値は科学的な形式で 2 進数で保持されます。ここで、0.07 は正確に表すことができず、0.070000000000000011 として保持されます。

詳細については、タグfloat 、ウィキペディア、およびすべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

于 2012-09-18T11:05:34.493 に答える