ข้อผิดพลาดแบบลอยตัวเกิดขึ้นเมื่อการคูณการคูณของทศนิยมใน JS
<script>
การแจ้งเตือน (11*22.9)
</script>
ผลที่ได้คือ 251.8999999999998 แทน 251.9
ต้องมีอาการปวดหัวของคนมากมาย แล้วจะแก้ปัญหาได้อย่างไร? ที่นี่ได้รับการแก้ปัญหา
1,
คัดลอกรหัสรหัสดังนี้:
<script>
การแจ้งเตือน (11*(22.9*10)/10);
</script>
แนวคิดโดยประมาณของการแก้ปัญหาคือปัจจัยที่ขยายเป็นจำนวนเต็มก่อนและในที่สุดก็หารด้วยหลายตัวที่สอดคล้องกันเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง
2,
คัดลอกรหัสรหัสดังนี้:
<สคริปต์เลื่อนลอย>
number.prototype.raate = function () {
var os.toString ();
if (OSTR.INDEXOF (".") ==-1)
กลับ 1;
อื่น
return math.pow (10, parseint (osr.length-organ.indexof (".");
-
ฟังก์ชั่น trans () {
args = trans.arguments;
test var = 1;
สำหรับ (i = 0; i <args.length; i ++)
temp*= args [i]*args [i] .raate ();
สำหรับ (i = 0; i <args.length; i ++)
temp/= args [i] .raate ();
กลับอุณหภูมิ
-
การแจ้งเตือน (ทรานส์ (11,22.9));
</script>
โซลูชันนี้เป็นวิธีที่ลำบากมากขึ้น แต่อาจทำให้คุณอาจเข้าใจกระบวนการจริงของการแก้ปัญหานี้
นอกจากนี้คุณยังสามารถใช้วิธีการของบ้านสี่หลังและวิธีการที่เข้ามาห้าวิธี .
คัดลอกรหัสรหัสดังนี้:
ฟังก์ชั่น FORDIGHT (Dight, How) {
dight = math.round (dight*math.pow (10, อย่างไร))/math.pow (10, อย่างไร);
กลับ Dign;
-
// ยกเว้นวิธีการที่จะได้วิธีการลบวิธีการที่แม่นยำ
// คำอธิบาย: ผลลัพธ์ของ JavaScript จะมีข้อผิดพลาดและมันจะชัดเจนเมื่อลบตัวเลขสองจุดลอยตัว ฟังก์ชั่นนี้ส่งคืนผลลัพธ์การกำจัดที่แม่นยำยิ่งขึ้น
// โทร: accdiv (arg1, arg2)
// ค่าส่งคืน: arg1 ยกเว้นผลลัพธ์ที่ถูกต้องของ arg2
ฟังก์ชั่น accdiv (arg1, arg2) {{
var t1 = 0, t2 = 0, r1, r2;
ลอง {t1 = arg1.toString ()
ลอง {t2 = arg2.toString ()
ด้วย (คณิตศาสตร์) {
r1 = number (arg1.toString (). แทนที่ (".", ""))
r2 = number (arg2.toString (). แทนที่ (".", ""))
return (R1/R2)*POW (10, T2-T1);
-
-
// เพิ่มเมธอด div ลงในประเภทหมายเลขซึ่งสะดวกกว่าในการโทร
number.prototype.div = function (arg) {
return accdiv (this, arg);
-
// ฟังก์ชั่นการคูณเพื่อให้ได้ผลลัพธ์การคูณที่แม่นยำ
// คำอธิบาย: ผลลัพธ์ของผลลัพธ์การคูณ JavaScript จะมีข้อผิดพลาดและจะชัดเจนเมื่อตัวเลขสองจุดลอยตัวถูกคูณ ฟังก์ชั่นนี้ส่งคืนผลลัพธ์การคูณที่แม่นยำยิ่งขึ้น
// โทร: Accmul (Arg1, Arg2)
// ค่าส่งคืน: Arg1 ถูกคูณด้วยผลลัพธ์ที่ถูกต้องของ Arg2
ฟังก์ชั่น accmul (arg1, arg2)
-
varm M = 0, s1 = arg1.toString (), s2 = arg2.toString ();
ลอง {m+= s1.split (".") [1] .length} catch (e) {}
ลอง {m+= s2.split (".") [1] .length} catch (e) {}
หมายเลขส่งคืน (s1.replace (".", "")*หมายเลข (s2.replace (".", "") /math.pow (10, m)
-
// เพิ่มวิธี MUL ลงในประเภทหมายเลขซึ่งสะดวกกว่าในการโทร
number.prototype.mul = function (arg) {
คืนค่า accmul (arg, this);
-
// เพิ่มวิธีการเพื่อรับผลลัพธ์เพิ่มเติมที่ถูกต้อง
// คำอธิบาย: ผลลัพธ์ของ JavaScript จะมีข้อผิดพลาดและมันจะชัดเจนมากขึ้นเมื่อเพิ่มหมายเลขจุดลอยตัวทั้งสอง ฟังก์ชั่นนี้ส่งคืนผลลัพธ์ที่แม่นยำยิ่งขึ้นของการเพิ่ม
// โทร: accidd (arg1, arg2)
// ค่าส่งคืน: arg1 บวกผลลัพธ์ที่แม่นยำของ arg2
Function Acadd (Arg1, Arg2) {{
var r1, r2, m;
ลอง {r1 = arg1.toString ()
ลอง {r2 = arg2.toString ()
m = math.pow (10, math.max (r1, r2)))))
return (arg1*m+arg2*m)/m
-
// เพิ่มวิธีเพิ่มวิธีการประเภทหมายเลขซึ่งสะดวกกว่าในการโทร
number.prototype.add = function (arg) {
Return Acadd (arg, this);
-