猿问

在 JavaScript 中添加和比较两个十进制数

我正在尝试添加两个十进制数字(参数可以是数字或在解析之前是数字的字符串)并将结果与resultInput. 问题在于系统不能足够准确地表示浮点数。例如,0.1 + 0.2 = 0.30000000000000004。所以,我正在尝试使用toFixed()方法使用定点表示法来格式化数字。false当我运行代码时,我得到了。不知道我哪里出错了。如果您有任何想法,请告诉我。


    function calc(firstNumber, secondNumber, operation, resultInput) {

      let a = parseFloat(firstNumber); //Number()

      let b = parseFloat(secondNumber); //Number()

      let c;

      let d = parseFloat(resultInput);

      console.log(JSON.stringify(`value of d : ${d}`)); //"value of d : NaN"

    

      switch (operation) {

        case '+':

          c = a + b;

          break;

        case '-':

          c = a - b;

          break;

        case '*':

          c = a * b;

          break;

        case '/':

         if (b === 0 && 1 / b === -Infinity) {

           r = Infinity;

         } else {

           r = a / b;

         }

          break;

        default:

          console.log(`Sorry, wrong operator: ${operation}.`);

      }

      console.log(JSON.stringify(`value of c: ${c}`)); // "value of c: 0.30000000000000004"

      let f = +c.toFixed(1);

      let e = +d.toFixed(1);

    

      console.log(JSON.stringify(`value of f: ${f}`)); // "value of f: 0.3"

      console.log(typeof f); //number

      console.log(JSON.stringify(`value of d: ${d}`)); // "value of d: NaN"

      console.log(typeof d); //number

      console.log(JSON.stringify(`value of e: ${e}`)); // "value of e: NaN"

      console.log(typeof e); //number

    

      if (f !== e) return false;

      // if (!Object.is(f, e)) return false;

      return true;

    }

    

    console.log(calc('0.1', '0.2', '+', '0.3'));


慕哥9229398
浏览 148回答 3
3回答

大话西游666

我多次运行你的代码,它没有问题。我刚刚发现'0.3'你发布的那个,它有一个特殊的字符,看起来像3但它不是3。所以,当你想在 JS 上运行它时,它会显示一个错误。所以你的解决方案是正确的。检查这里。function calc(firstNumber, secondNumber, operation, resultInput) {  let a = parseFloat(firstNumber);  let b = parseFloat(secondNumber);  let aux = parseFloat(resultInput);  let r;  switch (operation) {    case '+':      r = a + b;      break;    case '-':      r = a - b;      break;    case '*':      r = a * b;      break;    case '/':      if (b !== 0) {        r = a / b;      } else {        r = 0;      }      break;    default:      console.log(`Sorry, wrong operator: ${operation}.`);  }  return (+r.toFixed(1)) === (+aux.toFixed(1));}console.log(calc('0.1', '0.2', '+', '0.3'));

米脂

您可以创建一个函数来测试两个数字是否足够接近以被称为相等,而不是来回转换为/从字符串。你决定一些小的增量,如果数字至少接近,你称之为好。function almost(a, b, delta = 0.000001){&nbsp; &nbsp; return Math.abs(a - b) < delta}// not really equalconsole.log("equal?", 0.2 + 0.1 === 0.3)// but good enoughconsole.log("close enough?", almost(0.2 + 0.1, 0.3))
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答