我有一个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));
答案 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))
应该有效。