Este artigo analisa um problema de precisão inteira do JS. Compartilhe para sua referência. A análise específica é a seguinte:
Descrição do problema:
Há uma função de script em segundo plano, que pode escrever scripts para chamar o código Java dinamicamente
A cópia do código é a seguinte: ImportClass (com.ztgame.center.controller.api, p360apicontroller);
var roleid = 10214734953631045;
p360APIController.Notice (Roleid, 4);
O script foi executado com sucesso, mas o resultado em execução foi diferente das configurações. Esta pessoa não recebeu o e -mail
Veja o prêmio de recarga de logs foi enviado. Roleid = 10214734953631044;
Este número de identificação de caracteres é 1 a menos, isso ...
Análise de problemas:
Deve ser um problema de precisão do JS.
Precisão
Um número inteiro (sem contagem decimal ou exponencial) tem até 15 dígitos.
O número máximo de dígitos de um decimal é de 17, mas as operações de ponto flutuante nem sempre são 100% precisas:
Modifique o script
A cópia do código é a seguinte: var roleid = 10214734953631045;
var output = roleid;
Saída:
1.0214734953631044e16;
Isso não é culpa do JavaScript, nem é culpa do Java. A conversão acima para longa é de fato RoleId = 10214734953631044;
Isso pode ser feito?
O console JavaScript insere strings e, em seguida, chama inteiro.
Solução:
Escreva um método de conversão geral para passar o ID da função em uma string para JavaScriptEngine
A cópia do código é a seguinte: ImportClass (com.ztgame.common.util.stringkit);
ImportClass (com.ztgame.center.controller.api, p360apicontroller);
Declarar como uma corda
A cópia do código é a seguinte: var roleid = "10214734953631045";
Dessa forma, o que o JavaScriptNgine recebe é uma string. De fato, o trabalho é Java para processá -lo.
A cópia do código é a seguinte: p360apicontroller.Notice (stringkit.parselong (roleid), 4);
A execução é bem -sucedida, basta usá -la primeiro ~
Espero que este artigo seja útil para a programação JavaScript de todos.