1. คำนวณด้วย js
12.32 * 7 ผลเป็นอย่างไรบ้าง? คำตอบ: 86.24000000000001
เหตุใดปัญหานี้จึงเกิดขึ้น วิธีแก้ปัญหา?
มีข้อผิดพลาดใน js เมื่อต้องรับมือกับการคูณและการหารทศนิยม วิธีแก้ไขคือ: แปลงทศนิยมให้เป็นจำนวนเต็มเพื่อการประมวลผล
การคำนวณข้างต้นสามารถเปลี่ยนเป็น:
12.32*100*7/100
ผลลัพธ์คือ: 86.24 ถูกต้อง
ทำการคำนวณด้วย:
8.80*100*12/100
ผลลัพธ์: 105.60000000000002
ปัญหาที่คล้ายกันจะเกิดขึ้นกับ 38.80
ความแม่นยำเพิ่มขึ้น 10 เท่า:
8.80*1000*12/1000
ผลลัพธ์: 105.6
มันเป็นเรื่องปกติ
16.40 * 1000000 * 6 / 1000000
นอกจากนี้ยังมีปัญหากับผลลัพธ์
เพื่อให้การดำเนินการ js แม่นยำยิ่งขึ้น ในการคำนวณทศนิยม js ในอนาคต ให้ขยายค่าโดยตรง 10,000 ครั้ง แล้วหารด้วย 10,000 เพื่อแก้ปัญหา
วาร์นัม = 38.80;
วาร์ num2 = 13;
การแจ้งเตือน(ตัวเลข * 10,000 * 12/10,000);
ทดสอบจำนวนที่จะคูณหารแล้วพบว่าเป็น 10,000 หากน้อยกว่านี้จะทำให้เกิดปัญหาตามมาด้วย
สอง,
คัดลอกรหัสรหัสดังต่อไปนี้:
<เลื่อนสคริปต์>
Number.prototype.rate=function(){
varoStr=this.toString();
ถ้า(oStr.indexOf(".")==-1)
กลับ1;
อื่น
returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));
-
ฟังก์ชันทราน(){
args=tran.อาร์กิวเมนต์;
วาร์เทมป์=1;
สำหรับ(i=0;i<args.length;i++)
อุณหภูมิ*=args[i]*args[i].rate();
สำหรับ(i=0;i<args.length;i++)
อุณหภูมิ/=args[i].rate();
อุณหภูมิขากลับ
-
การแจ้งเตือน (ทราน (11,22.9));
</สคริปต์>
วิธีแก้ปัญหานี้ยุ่งยากกว่าเล็กน้อย แต่ช่วยให้คุณเข้าใจกระบวนการจริงในการแก้ปัญหานี้ได้
คัดลอกรหัสรหัสดังต่อไปนี้:
//ฟังก์ชันการหาร ใช้เพื่อให้ได้ผลลัพธ์การหารที่แม่นยำ
//หมายเหตุ: ผลการหารของ JavaScript จะมีข้อผิดพลาด ซึ่งจะชัดเจนมากขึ้นเมื่อหารเลขทศนิยมสองตัว ฟังก์ชันนี้ส่งคืนผลลัพธ์การหารที่แม่นยำยิ่งขึ้น
// โทร: accDiv (arg1, arg2)
//ค่าที่ส่งคืน: ผลลัพธ์ที่แน่นอนของการหาร arg1 ด้วย arg2
ฟังก์ชั่น accDiv (arg1, arg2) {
วาร์ t1=0,t2=0,r1,r2;
ลอง{t1=arg1.toString().split(".")[1].length}catch(e){}
ลอง{t2=arg2.toString().split(".")[1].length}catch(e){}
ด้วย(คณิตศาสตร์){
r1=หมายเลข(arg1.toString().replace(".",""))
r2=หมายเลข(arg2.toString().replace(".",""))
กลับ (r1/r2)*ธาร(10,t2-t1);
-
-
//เพิ่มวิธี div ให้กับประเภท Number เพื่อให้โทรได้สะดวกยิ่งขึ้น
Number.prototype.div = ฟังก์ชั่น (หาเรื่อง){
กลับ accDiv (นี่, หาเรื่อง);
-
//ฟังก์ชันการคูณ ใช้เพื่อให้ได้ผลลัพธ์การคูณที่แม่นยำ
//หมายเหตุ: ผลการคูณของ JavaScript จะมีข้อผิดพลาด ซึ่งจะชัดเจนมากขึ้นเมื่อคูณเลขทศนิยมสองตัว ฟังก์ชันนี้ส่งคืนผลลัพธ์การคูณที่แม่นยำยิ่งขึ้น
// โทร: accMul (arg1, arg2)
//ค่าที่ส่งคืน: ผลลัพธ์ที่แน่นอนของการคูณ arg1 ด้วย arg2
ฟังก์ชั่น accMul (arg1, arg2)
-
var m=0,s1=arg1.toString(),s2=arg2.toString();
ลอง{m+=s1.split(".")[1].length}catch(e){}
ลอง{m+=s2.split(".")[1].length}catch(e){}
หมายเลขส่งคืน (s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
-
// เพิ่มวิธี mul ให้กับประเภท Number เพื่อให้โทรได้สะดวกยิ่งขึ้น
Number.prototype.mul = ฟังก์ชั่น (หาเรื่อง){
กลับ accMul (หาเรื่อง, นี้);
-
//ฟังก์ชันการบวก ใช้เพื่อให้ได้ผลลัพธ์การบวกที่แม่นยำ
//หมายเหตุ: ผลลัพธ์การเพิ่มของ JavaScript จะมีข้อผิดพลาด ซึ่งจะชัดเจนยิ่งขึ้นเมื่อเพิ่มเลขทศนิยมสองตัว ฟังก์ชันนี้จะส่งกลับผลลัพธ์การบวกที่แม่นยำยิ่งขึ้น
// โทร: accAdd (arg1, arg2)
// ค่าที่ส่งคืน: ผลลัพธ์ที่แน่นอนของ arg1 บวก arg2
ฟังก์ชั่น accAdd (arg1, arg2) {
วาร์ r1,r2,m;
ลอง{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
ลอง{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
กลับ (arg1*m+arg2*m)/m
-
//เพิ่มวิธีการเพิ่มให้กับประเภท Number เพื่อให้โทรได้สะดวกยิ่งขึ้น
Number.prototype.add = ฟังก์ชั่น (หาเรื่อง){
กลับ accAdd(arg นี้);
-