我有下一个孤立的测试用例场景

@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个或更多dijits)时,才会发生这种情况,即使用 struts2-json-plugin-2.3.8.jar (最新)

    因此,这是一个 struts2 错误??

    问候,

    最佳答案

    问题在于Javascript中的数字是双精度浮点数,不能精确表示154456875042019001。双精度浮点数的精度为15-17位,而您为18位。当转换为浮点数并再次返回时,会损失一些精度。

    例如,在Perl中:

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

    输出
    154456875042019008
    

    更多详细信息:
    154456875042019001 10的十六进制表示形式为0x0224bdb5a1ff16b9,它包含58个有效位(二进制形式以0000 0010 0010 0100 ...开头,所以64减6前导零位)。双精度浮点数的精度为52位,因此在将64位long转换为double时会丢失一些位。

    10-08 19:09