Javascript方程产生不正确的值

时间:2016-08-10 19:24:50

标签: javascript

我有一个Javascript函数,它根据传递给它的变量返回结果。但是,它在计算过程中给出的值不正确。

我把罪魁祸首缩小到了这里:

Math.floor((obj.mem1.val1 + i) * (obj.mem2[param][j].val2))

当使用数字值替换代码中的变量时(是的,我已经检查过以确保它们是传递给等式的正确值),它是:

Math.floor((90 + 15) * (0.5343543))

哪一个应该等于56,而是给予4817。我甚至加入了:

alert(Math.floor((90 + 15) * (0.5343543)))

只是为了看看是否让浏览器手动运行精确计算产生正确的数字,但它仍然会提供一个警告框,显示4817

有什么可能这样做?这是基本的数学错误。我总是相信计算机能够正确地做到这一点。

修改

显示错误的示例代码:

var obj = {
  "mem1": {
    "val1": "90" // <-- issue was ultimately here this value was being
                 //     populated from 
                 //     document.getElementById().innerHTML
                 //     elsewhere in the code, so it was saving a string
    },
  "mem2": {
    "something-passed-through-param": [
      { "val2": 0.5343543 }
      ]
    }
  };

function func(param, i, j) {
  var ret = Math.floor((obj.mem1.val1 + i) * (obj.mem2[param][j].val2));
  return ret;
  }

// Correct code would have been:
var ret = Math.floor((Number(obj.mem1.val1) + i) * (obj.mem2[param][j].val2));

4 个答案:

答案 0 :(得分:2)

正如评论中所提到的,表达式Math.floor(("90"+"15") * (0.5343543));提供了4817

答案 1 :(得分:1)

根据评论,问题是obj.mem1.val1作为字符串传递给计算,导致('90' + 15) * (0.5343543)或更可能('90' + 1) * (0.5343543)。将其转换为数字可以解决问题。这可以这样做:

Math.floor((+obj.mem1.val1 + i) * (obj.mem2[param][j].val2))

Math.floor((Number(obj.mem1.val1) + i) * (obj.mem2[param][j].val2))

以及其他一些方法。

答案 2 :(得分:0)

使用:Math.floor((obj.mem1.val1 * 1 + i)*(obj.mem2 [param] [j] .val2))

答案 3 :(得分:0)

Math.floor(('90' + '15') * (0.5343543))返回4817。这意味着您需要将obj.mem1.val1以及i转换为整数。

如果那是您的错误,

Math.floor((parseInt(obj.mem1.val1) + parseInt(i)) * (obj.mem2[param][j].val2))应该有效。