【问题标题】:Adding two numbers in JavaScript incorrectly [duplicate]在 JavaScript 中错误地添加两个数字 [重复]
【发布时间】:2010-09-03 17:23:58
【问题描述】:
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。为什么?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    简单示例:

     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)

    以下是一些后果:
    (来源:phrogz.net

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

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

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

    【讨论】:

    • +1、+ss*1 不仅是简写,而且更正确。
    • +1。我要补充一点,Number() 也可以给你奇怪的结果。例如,+" "+"" 将导致 0 其中 parseInt(" ", 10) 将返回 NaNNumber() 在转换前修剪空白,修剪后的空字符串将始终导致 0。与其他方法的起伏一样,是否需要这种行为可能会因使用情况而异。很多时候,我使用+(它对我来说已经足够突出),但绝对值得确保您不会被机器中看起来像幽灵的东西所吸引。
    • 感谢@Phrogz 的 *1 提示。我正在编写一个 js 计算器,它使用 parsefloat() 并且在桌面浏览器上运行良好,但在移动浏览器中四舍五入(3.14 * 2 = 6 !!!!)。我要试试这个,看看会不会有什么不同。
    • 嗨@Phrogz,我尝试了你的“1*”解析浮点数的建议。它适用于桌面浏览器,但不适用于我尝试过的移动浏览器。但是,(1.0)* 即使在移动 FireFox 和 Chrome 上也能正常工作。我建议你在你的帖子中包含这个。谢谢
    • @fetah 我认为这种说法不太可能,在包含此类信息之前需要查看一个简单的示例证明。
    【解决方案2】:

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

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

    如果这些数字是十进制的,您将需要 parseFloat 方法。

    【讨论】:

      【解决方案3】:

      试试

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

      10 指定以 10 为底,否则存在被解析为八进制的可能性。

      【讨论】:

      • 只是一个小问题 - 虽然您总是指定基数是个好主意,但默认基数确实是 10 而不是八进制。它假定从零开始的字符串为八进制(例如"0120")。
      • 所以从“否则它是八进制”更改为“否则值被解析为八进制存在的机会”将是一个很好的编辑?都是关于最佳实践的,对吧?
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        我不知道为什么括号对您没有帮助。
        如果我尝试

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

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

        语言设计的错误之一是 + 既是加法运算符又是连接运算符。再加上它的类型很松散并且会隐式转换,这意味着它会给您带来一些令人讨厌的惊喜,除非您采取措施确保您确实是在添加数字而不是连接字符串。在这种情况下,它将您的基础 + 预先视为字符串,因此进行连接。

        无论如何,解决方法可能是改用(base - upfront*-1)

        【讨论】:

          【解决方案6】:

          它把它当作一个字符串来处理。您需要在字符串之前进行数学运算。示例:

          base + upfront + ' string' 
          

          将返回“15036 字符串”。

          string + base + upfront
          

          如您现在所见,将返回字符串 1500036。

          或使用parseInt()

          【讨论】:

          • 他正在使用括号,因此添加将在尝试与其他字符串合并之前执行(即,如果您使用括号,则不必在字符串“之前”进行数学运算)。但是,parseInt 可以工作 - + 运算符将他的至少一个操作数视为字符串。
          猜你喜欢
          • 2019-10-15
          • 2021-12-22
          • 2023-03-03
          • 1970-01-01
          • 2016-06-12
          • 2016-10-16
          • 1970-01-01
          • 2014-07-06
          • 2019-09-11
          相关资源
          最近更新 更多