บทความนี้วิเคราะห์ปัญหาความแม่นยำจำนวนเต็ม JS Long Long แบ่งปันสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
คำอธิบายปัญหา:
มีฟังก์ชั่นสคริปต์ในพื้นหลังซึ่งสามารถเขียนสคริปต์เพื่อเรียกรหัส Java แบบไดนามิก
การคัดลอกรหัสมีดังนี้: ImportClass (com.ztgame.center.controller.api, p360apicontroller);
var roleid = 10214734953631045;
p360apicontroller.notice (Roleid, 4);
สคริปต์ถูกดำเนินการสำเร็จ แต่ผลการทำงานนั้นแตกต่างจากการตั้งค่า บุคคลนี้ไม่ได้รับอีเมล
ดูรางวัล Log Recharge Award ถูกส่งไปแล้ว Roleid = 10214734953631044;
หมายเลขรหัสอักขระนี้น้อยกว่านี้ ...
การวิเคราะห์ปัญหา:
มันควรจะเป็นปัญหาความแม่นยำของ JS
ความแม่นยำ
จำนวนเต็ม (โดยไม่มีทศนิยมหรือการนับแบบทวีคูณ) สูงถึง 15 หลัก
จำนวนหลักสูงสุดของทศนิยมคือ 17 แต่การดำเนินการจุดลอยตัวนั้นไม่ถูกต้อง 100% เสมอไป:
แก้ไขสคริปต์
การคัดลอกรหัสมีดังนี้: var roleid = 10214734953631045;
var output = roleid;
เอาท์พุท:
1.0214734953631044E16;
นี่ไม่ใช่ความผิดของ JavaScript และไม่ใช่ความผิดของ Java การแปลงข้างต้นเป็นความยาวนั้นเป็นไปได้อย่างแท้จริง = 10214734953631044;
สามารถทำได้หรือไม่?
สตริงอินพุต JavaScript แล้วเรียกใช้ Integer.ValueOf หรือ Long.ValueOf การแปลงใน Java?
สารละลาย:
เขียนวิธีการแปลงทั่วไปเพื่อส่งรหัสบทบาทไปยังสตริงไปยัง 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 ของทุกคน