为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2021-06-01 21:55:20
我正在尝试添加两个十进制数字(参数可以是数字或在解析之前是数字的字符串)并将结果与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'));
查看完整描述

3 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

我多次运行你的代码,它没有问题。我刚刚发现'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'));


查看完整回答
反对 回复 2021-06-03
?
米脂

TA贡献1836条经验 获得超3个赞

您可以创建一个函数来测试两个数字是否足够接近以被称为相等,而不是来回转换为/从字符串。你决定一些小的增量,如果数字至少接近,你称之为好。


function almost(a, b, delta = 0.000001){

    return Math.abs(a - b) < delta

}


// not really equal

console.log("equal?", 0.2 + 0.1 === 0.3)


// but good enough

console.log("close enough?", almost(0.2 + 0.1, 0.3))


查看完整回答
反对 回复 2021-06-03
  • 3 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信