在JavaScript中正确添加两个数字

时间:2010-09-03 17:23:59

标签: javascript

Global.alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront));

上面的代码输出如下:

base: 15000, upfront: 36, both: 1500036

为什么要加入这两个数字而不是添加它们?

我最终想要使用以下方法将另一个字段的值设置为此数量:

mainPanel.feesPanel.initialLoanAmount.setValue(Ext.util.Format.number((base + upfront), '$0,000.00'));

当我尝试时,它将数字变为数百万而不是15,036.00。为什么呢?

6 个答案:

答案 0 :(得分:24)

简单示例:

 1 +1 == 2
"1"+1 == "11"
"1"*1 + 1 == 2

将字符串转换为数字的方法:

  • parseInt(str)
  • parseInt(str,10)
  • parseFloat(str)
  • +str
  • str*1
  • str-0
  • str<<0
  • Number(str)

以下是一些后果: Results of converting various strings using the above techniques http://phrogz.net/JS/string_to_number.png

Number(str)str*1具有相同的行为,但需要进行函数调用。

我个人使用*1因为它很短,但仍然很突出(与一元+不同),并且或者给我用户输入或完全失败的内容。当我知道时,我只会使用parseInt(),最后会忽略非数字内容,或者当我需要解析非基数为10的字符串时。

您可以在浏览器at my example page中测试这些效果。

答案 1 :(得分:11)

这可能是因为它们是字符串。尝试解析它们:

Global.alert(
    "base: " + base + ", upfront: " + upfront + ", both: " + 
    (parseInt(base) + parseInt(upfront))
);

如果这些数字是小数,则需要使用parseFloat方法。

答案 2 :(得分:6)

尝试

Global.alert(
    "base: " + base + ", upfront: " + upfront + ", both: " + 
    (parseInt(base,10) + parseInt(upfront,10))
);

10指定基数10,否则存在将值解析为八进制的可能性。

答案 3 :(得分:1)

它将它作为一个字符串处理。你需要在字符串之前做数学运算。例如:

base + upfront + ' string' 

会返回“15036 string”。

string + base + upfront
正如您现在所见,

将返回字符串1500036。

或使用parseInt()

答案 4 :(得分:1)

http://jsperf.com/number-vs-parseint-vs-plus/3

您可能也会感兴趣。 这只是这里已经提到的方法的性能比较。

答案 5 :(得分:1)

我不知道为什么括号不会帮助你 如果我试试

var base = 500;
var upfront = 100;
alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront))

我确实得到了600作为答案,所以Global.alert函数可能会发生一些事情吗?

语言设计的一个错误是+既是加法运算符又是连接运算符。加上它是松散类型并且隐式转换的事实意味着它可以给你一些令人讨厌的惊喜,除非你采取措施确保你真的在添加数字而不是连接字符串。在这种情况下,它将您的base + beforefront视为字符串,因此连接。

无论如何,绕过它可能会改为(base - upfront*-1)