Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中不正确地添加两个数字_Javascript - Fatal编程技术网

在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,而不是八进制。对于从零开始的字符串(例如
    “0120”
    ),它假定为八进制。因此,将“否则它是八进制的”更改为“否则值被解析为八进制存在的可能性”将是一个好的编辑?这都是关于最佳实践的,对吗?他在使用括号,因此加法将在尝试与其他字符串合并之前执行(即,如果使用括号,则不必在字符串“之前”进行数学运算)。但是,parseInt可以工作-+运算符将至少一个操作数视为字符串。+1、
    +s
    s*1
    不仅是缩写,而且更正确。+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