ホームページ >ウェブフロントエンド >jsチュートリアル >JS長整数精度問題の分析例_JavaScriptスキル

JS長整数精度問題の分析例_JavaScriptスキル

WBOY
WBOYオリジナル
2016-05-16 16:20:221290ブラウズ

この記事では、例として 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);

文字列として宣言されています


コードをコピー コードは次のとおりです:var roleId = "10214734953631045";
このように、JavaScriptEngine が取得するのは文字列です。実際には、その作業は Java
によって処理されます。


コードをコピーします コードは次のとおりです:p360ApiController.notice(StringKit.parseLong(roleId), 4);
実行は成功しました。このように使用してください~
この記事が皆様の JavaScript プログラミング設計に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。