3

私は次の分離されたテスト ケース シナリオを持っています

@SMDMethod
public BigInteger getSomeReallyBigInteger() {
    return new BigInteger("154456875042019001");
}

これは struts.xml でのアクションです

    <action name="DataSourceRpc" class="isoblock.struts2.action.DataSourceAction" method="smd">
        <interceptor-ref name="json">
            <param name="enableSMD">true</param> 
        </interceptor-ref>
        <result type="json">
            <param name="enableSMD">true</param>
        </result>
    </action>

JSON-RPC 実装 (dojo-rpc を使用) を使用して SMD 関数を呼び出していますが、これは失敗です。

最後の関数を呼び出すと、結果のコールバックは次のようになります。

  • 154456875042019000

それ以外の

  • 154456875042019001

これは大きな数字 (すべて 17 以上の dijit) でのみ発生します。struts2-json-plugin-2.3.8.jar (最新)を使用しています。

それで、これはstruts2のバグですか??

ご挨拶、

4

1 に答える 1

2

問題は、Javascript の数値が倍精度浮動小数点数であり、154456875042019001 を正確に表すことができないことです。倍精度浮動小数点数の精度は 15 ~ 17 桁で、ユーザーは 18 桁です。float に変換してから再び戻すと、一部の精度が失われます。

たとえば、Perl では次のようになります。

$a=154456875042019001.0;
printf "%20d",$a;

出力

154456875042019008

詳細:

15445687504201900110の 16 進表現は であり0x0224bdb5a1ff16b9、これには 58 の有効ビットが含まれます (2 進数では で始まる0000 0010 0010 0100 ...ため、64 から先行ゼロの 6 ビットを引いたもの)。倍精度浮動小数点数の精度は 52 ビットであるため、64 ビットlongをに変換すると一部のビットが失われdoubleます。

于 2013-05-31T23:27:15.617 に答える