我有下一个孤立的测试用例场景
@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函数,这是失败的原因,
当我调用最后一个函数时,结果回调为其:
代替
仅当使用大数字(全部具有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
时会丢失一些位。