JS:想做購物車?先學好加、減、乘、除的計算!

我的代碼有多短,本文章就有多短!(ㅍ_ㅍ)

※ 思路分析

對於整數的運算,不會出錯;而帶了小數點的運算,直接計算容易出錯。推薦的做法是,帶了小數點的計算,都要經過處理。

因此,對於帶小數的加、減、乘、除運算,先變爲整數的運算,再將得到的結果變回去(由中間值處理),得到最終的結果。

一、加法運算

1. 先看直接計算:

console.log(0.1 + 0.2);
// 打印結果 0.30000000000000004

2. 代碼實現

function calcPlus(num1, num2) {
  let l1, l2, m;
  try {
    l1 = num1.toString().split(".")[1].length;
  } catch(e) {
    l1 = 0;
  }
  try {
    l2 = num2.toString().split(".")[1].length;
  } catch(e) {
    l2 = 0;
  }
  m = Math.pow(10, Math.max(l1, l2));
  return (num1 * m + num2 * m) / m;
}

console.log(0.1 + 0.2, calcPlus(0.1, 0.2));
// 輸出: 0.30000000000000004 0.3

代碼解析:

m:得到小數點的位數的最大值,並10的次方得到中間值;

m=10^{1}=10,因此計算式爲:(0.1 * 10 + 0.2 * 10) / 10 = (1 + 2) / 10 = 3 / 10 = 0.3

二、減法運算

1. 先看直接計算:

console.log(1.0 - 0.9);
// 輸出: 0.09999999999999998

2. 代碼實現

function calcSubtract(num1, num2) {
  let l1, l2, m;
  try {
    l1 = num1.toString().split(".")[1].length;
  } catch(e) {
    l1 = 0;
  }
  try {
    l2 = num2.toString().split(".")[1].length;
  } catch(e) {
    l2 = 0;
  }
  m = Math.pow(10, Math.max(l1, l2));
  return (num1 * m - num2 * m) / m;
}

console.log(1.0 - 0.9, calcSubtract(1.0, 0.9));
// 輸出: 0.09999999999999998 0.1

代碼解析:

m:得到小數點的位數的最大值,並10的次方得到中間值;

m=10^{1}=10,因此計算式爲:(1.0 * 10 - 0.9 * 10) / 10 = (10 - 9) / 10 = 1 / 10 = 0.1

三、乘法運算

1. 先看直接計算:

console.log(19.9 * 100);
// 輸出:1989.999999999999

2. 代碼實現

function calcMultiply(num1, num2) {
  let m = 0;
  try {
    m += num1.toString().split(".")[1].length;
  } catch(e) {}
  try {
    m += num2.toString().split(".")[1].length;
  } catch(e) {}
  return (Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", ""))) / Math.pow(10, m);
}

console.log(19.9 * 100, calcMultiply(19.9, 100));
// 輸出:1989.9999999999998 1990

代碼解析:

m:得到小數點的最大的位數;

因此計算式爲:(199 * 100) / 10^{1} = 19900 / 10 = 1990

四、除法運算

1. 先看直接計算:

console.log(6.6 / 0.2);
// 輸出:32.99999999999999

2. 代碼實現

function calcDivide(num1, num2) {
  let l1 = 0, l2 = 0, n1, n2;
  try {
    l1 = num1.toString().split(".")[1].length;
  } catch(e) {}
  try {
    l2 = num2.toString().split(".")[1].length;
  } catch(e) {}
  n1 = Number(num1.toString().replace(".", ""));
  n2 = Number(num2.toString().replace(".", ""));
  return (n1 / n2) * Math.pow(10, l2 - l1);
}

console.log(6.6 / 0.2, calcDivide(6.6, 0.2));
// 輸出:32.99999999999999 33

代碼解析:

n1,n2:去除小數點,即變爲整數

l2-l1:位數差,即中間值

因此計算式爲:(66 / 2) * 10^{0} = 33 * 1 = 33

附件下載(CSDN)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章