この記事では、例として JS 長整数の精度の問題を分析します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
問題の説明:
バックグラウンドにスクリプト関数があり、Java コードを動的に呼び出すスクリプトを作成できます
importClass(com.ztgame.center.controller.api,P360ApiController);
var roleId = 10214734953631045;
p360ApiController.notice(roleId, 4);
スクリプトは正常に実行されましたが、結果は設定と異なりました。この人はメールを受信しませんでした
。
ログ リチャージ特典を送信しました roleId=10214734953631044;
このキャラクターの ID 番号は 1 つ少ないです、これは....
問題分析:
これは JS の精度の問題であるはずです。
精度
整数 (小数点または指数表記なし) は最大 15 桁です。
小数点以下の最大桁数は 17 ですが、浮動小数点演算は常に 100% 正確であるとは限りません:
スクリプトを変更する
var roleId = 10214734953631045;
var 出力 = roleId;
出力:
1.0214734953631044E16;
これは JavaScript のせいでも Java のせいでもありません。実際、上記の Long への変換は roleId=10214734953631044;
です。
それは可能ですか?
JavaScript コンソールの入力はすべて文字列であり、Java で Integer.valueOf または Long.valueOf 変換を呼び出します。
解決策:
文字 ID を文字列として JavaScriptEngine に渡す一般的な変換メソッドを記述します
コードをコピーします コードは次のとおりです。importClass(com.ztgame.common.util.StringKit); >
importClass(com.ztgame.center.controller.api,P360ApiController);
文字列として宣言されています
このように、JavaScriptEngine が取得するのは文字列です。実際には、その作業は Java
によって処理されます。
コードをコピーします
コードは次のとおりです:p360ApiController.notice(StringKit.parseLong(roleId), 4);
実行は成功しました。このように使用してください~
この記事が皆様の JavaScript プログラミング設計に役立つことを願っています。