1. ใช้ JS เพื่อคำนวณ
12.32 * 7 ผลลัพธ์คืออะไร?
คำตอบ: 86.240000000000001
ทำไมปัญหานี้จึงเกิดขึ้น? วิธีแก้ปัญหา?
มีข้อผิดพลาดเมื่อ JS เกี่ยวข้องกับการคูณและการแบ่งทศนิยม การแก้ปัญหาสามารถ: เปลี่ยนทศนิยมเป็นจำนวนเต็มเพื่อจัดการ
การคำนวณข้างต้นสามารถเปลี่ยนเป็น:
12.32 * 100 * 7/100
ผลลัพธ์คือ: 86.24, ถูกต้อง
มาคำนวณอีกครั้ง:
8.80 * 100 * 12/100
ผลลัพธ์: 105.600000000000002
ปัญหาที่คล้ายกันจะเกิดขึ้นที่ 38.80
เพิ่มความแม่นยำ 10 ครั้ง:
8.80 * 1000 * 12/1000
ผลลัพธ์: 105.6
เป็นเรื่องปกติ
16.40 * 1000000 * 6/1000000
มีปัญหากับผลลัพธ์
เพื่อให้การดำเนินการ JS แม่นยำยิ่งขึ้นค่าสามารถขยายได้โดยตรง 10,000 ครั้งในการคำนวณทศนิยม JS ที่ตามมาจากนั้นหารด้วย 10,000 เพื่อแก้ปัญหา
var num = 38.80;
var num2 = 13;
การแจ้งเตือน (num * 10,000 * 12/10000);
จำนวนคูณและหารด้วย 10,000 นั้นเหมาะสมที่สุดสำหรับการทดสอบ ตัวเลขบางตัวมีปัญหาเมื่อพวกเขามีขนาดเล็กลงและตัวเลขบางตัวมีปัญหาเมื่อมีขนาดใหญ่กว่า (1,000,000)
สอง,
<script> number.prototype.rate = function () {varosttr = this.toString (); ถ้า (OSTR.Indexof (".") ==-1) return1; elsereturnmath.pow (10, parseint functionTran () {args = tran.arguments; vartemp = 1; สำหรับ (i = 0; i <args.length; i ++) temp*= args [i]*args [i] .rate (); สำหรับ (i = 0; i <args.length; i ++) temp/= args [i] </script>โซลูชันนี้เป็นวิธีแก้ปัญหาที่ยุ่งยากมากขึ้น แต่มันสามารถให้ความเข้าใจคร่าวๆเกี่ยวกับกระบวนการจริงของการแก้ปัญหานี้
// ฟังก์ชั่นหารใช้เพื่อให้ได้ผลลัพธ์การหารที่แม่นยำ // หมายเหตุ: จะมีข้อผิดพลาดในผลการแบ่งของ JavaScript ซึ่งจะชัดเจนมากขึ้นเมื่อหารหมายเลขจุดลอยตัวสองจุด ฟังก์ชั่นนี้ส่งคืนผลการแบ่งที่แม่นยำยิ่งขึ้น // การโทร: accdiv (arg1, arg2) // ค่าส่งคืน: ผลลัพธ์ที่แน่นอนของ arg1 หารด้วยฟังก์ชั่น arg2 accdiv (arg1, arg2) {var t1 = 0, t2 = 0, r1, r2; ลอง {t1 = arg1.toString (). แยก (".") [1] .length} catch (e) {} ลอง {t2 = arg2.toString (). แยก (") [1] th} catch (e) {} ด้วย (คณิตศาสตร์) {r1 = number (arg1.toString (). แทนที่ (".", ",")) r2 = number (arg2.toString (). แทนที่ (".", ")) (R1/R2)*POW (10, T2-T1);}} // เพิ่มวิธี DIV ลงในประเภทตัวเลขทำให้การโทรสะดวกยิ่งขึ้น number.prototype.div = function (arg) {return accdiv (this, arg);} // ฟังก์ชั่นหลายฟังก์ชันเพื่อให้ได้ผลลัพธ์การคูณที่ถูกต้อง // หมายเหตุ: จะมีข้อผิดพลาดในผลลัพธ์การคูณของ JavaScript ซึ่งจะชัดเจนยิ่งขึ้น ฟังก์ชั่นนี้ส่งคืนผลลัพธ์การคูณที่แม่นยำยิ่งขึ้น // CALL: ACCMUL (ARG1, ARG2) // ค่าส่งคืน: ผลลัพธ์ที่แน่นอนของ ARG1 คูณด้วยฟังก์ชั่น Arg2 ACCMUL (ARG1, ARG2) {var m = 0, s1 = arg1.toString (), s2 = arg2.toString (); ลอง {m+= s1.split (".") [1]. ความยาว} จับ (e) {} ลอง {m+= s2.split (".") [1]. หมายเลข (s1.replace (".", "))*number (s2.replace (". ","))/math.pow (10, m)} // เพิ่มวิธี mul ลงในประเภทหมายเลขซึ่งสะดวกกว่าในการโทร number.prototype.mul = function (arg) {return accmul (arg, this);} // ฟังก์ชั่นการเพิ่มเพื่อให้ได้ผลลัพธ์การเพิ่มที่ถูกต้อง // หมายเหตุ: จะมีข้อผิดพลาดในผลการเพิ่มของ JavaScript ซึ่งจะชัดเจนยิ่งขึ้นเมื่อเพิ่มตัวเลขลอยสองจุด ฟังก์ชั่นนี้ส่งคืนผลลัพธ์การเพิ่มที่แม่นยำยิ่งขึ้น // call: accadd (arg1, arg2) // ค่าส่งคืน: ผลลัพธ์ที่แน่นอนของฟังก์ชั่น arg1 plus arg2 accadd (arg1, arg2) {var r1, r2, m; ลอง {r1 = arg1.toString (). split (".") [1] .length} catch (e) {r1 = 0} ลอง {r2 = arg2.toString () แยก (") [1]. (arg1*m+arg2*m)/m} // เพิ่มวิธีการเพิ่มลงในประเภทตัวเลขทำให้การโทรสะดวกยิ่งขึ้น number.prototype.add = function (arg) {return accadd (arg, this);}การจัดการข้อผิดพลาดการคูณของทศนิยม JavaScript ด้านบนคือเนื้อหาทั้งหมดที่ฉันได้แชร์กับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น