在JavaScript中不正确地添加两个数字
上面的代码输出如下内容:在JavaScript中不正确地添加两个数字,javascript,Javascript,上面的代码输出如下内容: Global.alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront)); 为什么把这两个数字连起来而不是加起来 我最终希望使用以下方法将另一个字段的值设置为该金额: base: 15000, upfront: 36, both: 1500036 当我试着这么做的时候,它把数字变成了百万而不是15036.00。为什么?这可能是因为它们是字符串。尝试分析它们: mai
Global.alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront));
为什么把这两个数字连起来而不是加起来
我最终希望使用以下方法将另一个字段的值设置为该金额:
base: 15000, upfront: 36, both: 1500036
当我试着这么做的时候,它把数字变成了百万而不是15036.00。为什么?这可能是因为它们是字符串。尝试分析它们:
mainPanel.feesPanel.initialLoanAmount.setValue(Ext.util.Format.number((base + upfront), '$0,000.00'));
如果这些数字是十进制的,则需要使用
parseFloat
方法。它将其作为字符串处理。你需要先做数学题,然后再做字符串。例如:
Global.alert(
"base: " + base + ", upfront: " + upfront + ", both: " +
(parseInt(base) + parseInt(upfront))
);
将返回“15036字符串”
将返回字符串1500036,正如您现在看到的
或者使用。试试看
string + base + upfront
10指定基数10,否则值被解析为八进制的可能性就存在。
你可能也会感兴趣。
这只是对这里已经提到的方法的性能比较。我不知道为什么括号不能帮助您。
如果我尝试 我得到的答案是600,所以可能是Global.alert函数中发生了什么 语言设计的错误之一是+既是加法运算符又是串联运算符。再加上它是松散类型且将隐式强制转换这一事实,意味着它可能会给您带来一些令人不快的惊喜,除非您采取措施确保您确实在添加数字而不是连接字符串。在本例中,它将您的base+前端视为字符串,并因此进行连接 无论如何,解决方法可能是使用
(base-upfront*-1)
。简单示例:
var base = 500;
var upfront = 100;
alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront))
将字符串转换为数字的方法:
parseInt(str)
parseInt(str,10)
parseFloat(str)
+str
str*1
str-0
strJust a minor nit-虽然您总是正确地指定基数是个好主意,但默认基数实际上是10,而不是八进制。对于从零开始的字符串(例如
),它假定为八进制。因此,将“否则它是八进制的”更改为“否则值被解析为八进制存在的可能性”将是一个好的编辑?这都是关于最佳实践的,对吗?他在使用括号,因此加法将在尝试与其他字符串合并之前执行(即,如果使用括号,则不必在字符串“之前”进行数学运算)。但是,parseInt可以工作-+运算符将至少一个操作数视为字符串。+1、“0120”
和+s
不仅是缩写,而且更正确。+1。我要补充的是,s*1
也会给你带来奇怪的结果。例如,Number()
和+”
将导致+”
,其中0
将返回parseInt(“,10)
NaN
在转换前修剪空白,修剪后的空字符串将始终导致Number()
。就像其他方法的起伏一样,这种行为是否理想可能因使用情况而异。我经常使用0
(这对我来说已经足够突出了),但绝对值得确保你不会被机器中看起来像鬼魂的东西抓住。谢谢@Phrogz的*1提示。我正在编写一个js计算器,它使用parsefloat()并在桌面浏览器中运行良好,但在移动浏览器中使用小数(3.14*2=6!!!!)。我要试试这个,看看它是否会有什么不同。嗨@Phrogz,我试过你的“1*”建议来解析浮点数。它在桌面浏览器上运行良好,但在我尝试过的移动浏览器上却不行。然而,(1.0)*即使在移动FireFox和Chrome上也能正常工作。我建议你在你的帖子中包括这一点。Thanks@fetah我认为这种说法是不可能的,在包含此类信息之前,需要看一个简单的示例证明。+
Global.alert( "base: " + base + ", upfront: " + upfront + ", both: " + (parseInt(base,10) + parseInt(upfront,10)) );
var base = 500; var upfront = 100; alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront))
1 +1 == 2 "1"+1 == "11" "1"*1 + 1 == 2