Javascript関数の数値タイプパラメータの値伝達の危険性


今日、プログラムを书く时に変なことがあって、业务の需要はとても简単で、ただクライアントのJSの方法を通じてAJAXの要求を行って、バックグラウンドに伝わるパラメータは1つの注文の子の番号で、バックグラウンドでbeanshellでIDを通じて注文の子を取得してそしてその返済の状态を修正して保存します.

function passRefundApply(orderItemId){
	 	//alert(orderItemId);
	 	$.ajax({  
			     type: "get",  
			     url: "/openorder/control/updateRefundStatus",  
			     data:"orderItemId="+orderItemId+"&refundStatus=P",  
			     cache: false,  
			     success: function(msg){  
			        var result = eval("("+removeDivTag(msg)+")");
			        try{
				        if(result.result!="success"){
				        	alert("    ,   !");
				        	return;
				        }	
				    }catch(e){
				    	alert("    ,   !");
				        return;
				    }		        
			        $("#refundStatus_"+orderItemId)[0].innerHTML = "       ";
			     }  
			});			
	 }


このメソッドの呼び出しエントリはJSを使用して即座に生成されるからです.

       $("#refundStatus_"+orderItemId)[0].innerHTML = "<a href=\"javascript:void(0);\" onclick=\"passRefundApply("+orderItemId+")\">    </a>&nbsp;&nbsp;<a href=\"javascript:void(0);\" onclick=\"rejectRefundApply("+orderItemId+")\">    </a>";

入力された受注サブアイテムIDは102010055021047710584であり、データベースに対応するレコードがあることが確認された.しかし、バックグラウンドでは、送信された受注サブアイテムIDを使用してデータベース内の対応するデータを取得できません.ログを表示すると、送信された受注サブアイテムIDは102010055021047710000であることがわかります.追跡してfirebugを利用することにより、IDは関数呼び出しpassRefindApply(102010055021047710584)では正常であるが、関数passRefindApplyでは最初の行alertが102010055021047710000であることが判明した.
上記の現象に鑑みて、実験をして、手帳でhtmファイルを新規作成して、中に書くだけです.

       <script>
	      alert(12345678900987654321);
       </script>

何が出てきたの?
12345678900987654000です......精度が失われた.JSの弱いタイプは使いやすいと思っていたが、ここでは危険な落とし穴があり、次回はできるだけ項目に文字列を使って値を伝え、引用符をつけて万全を期す.
ここで精度の喪失について補足すると、Javascriptのデジタルデータ型は整数値と浮動小数点型の数値を区別せず、すべての数値は浮動小数点型で表される.10進数の場合、Javascriptは-9007199254740992(-2の53回)から9007199254740992(2の53回)までのすべての整数を正確に表すことができ、超えるとビット数の精度が失われます.『Javascript権威ガイド』を参照してください.