【问题标题】:Javascript: "+" sign concatenates instead of giving sum of variablesJavascript:“+”符号连接而不是给出变量的总和
【发布时间】:2016-05-06 09:21:54
【问题描述】:

我目前正在创建一个网站,可以帮助我快速回答物理问题。 碰巧,代码没有按预期运行,这里是代码

if (option == "dv") {
    var Vinitial = prompt("What is the Velocity Initial?")
    var acceleration = prompt("what is the acceleration?")
    var time = prompt("what is the time?")

    Vfinal = Vinitial + acceleration * time

    displayV.innerHTML = "v= vf= " + Vfinal + "ms" + sup1.sup();
}

现在,假设 Vinitial 是 9,加速度是 2,时间是 3。 当代码运行时,“Vfinal”没有得到 15,而是得到 96。 我发现它可以很好地乘以加速度和时间,然后将开头的 9 与 6(2 * 3 的乘积)连接起来。

我现在已经通过使用修复它

Vfinal =  acceleration * time - (-Vinitial)

避免使用“+”号,但我不想继续这样做。我该如何解决?

【问题讨论】:

  • 将值从字符串转换为整数
  • Vfinal = + Vinitial + acceleration * time - 在开始时额外添加+ 以强制执行数值运算。
  • 您的每个值 Vinitialaccelerationtime 都是字符串不是数字。因此,这是定义的行为。尝试解析字符串...例如Number.parseInt(Vinitial)

标签: javascript variables sum concatenation


【解决方案1】:

你在这里处理strings,对字符串的数学运算会搞砸。请记住当您进行数学运算时,您必须将数据转换为实际数字,然后执行数学运算

使用 parseInt() more Details here

您的代码应更改为

Vfinal = parseInt(Vinitial,10) + parseInt(acceleration,10) * parseInt(time,10);

编辑1:如果数字是十进制值,则改用parseFloat()

所以代码是

Vfinal = parseFloat(Vinitial) + parseFloat(acceleration) * parseFloat(time);

【讨论】:

  • 我实际上只是从 JS 开始,当我使用建议的代码时,我使用的任何类型的小数都会在最终结果中被忽略,这是我并不真正想要的。我尝试阅读“parseInt()”,但对我没有多大帮助。
  • @KeaneCarotenuto 如果您使用十进制值,则需要使用parseFloat()
【解决方案2】:

Object-Oriented JavaScript - Second Edition:如您所知,当您将加号与两个数字一起使用时,这 是算术加法运算。但是,如果您使用加号 用字符串签名,这是一个字符串连接操作,它 返回粘合在一起的两个字符串:

var s1 = "web";
var s2 = "site";
s1 + s2; // website

+ 运算符的双重用途是错误的来源。所以, 如果您打算连接字符串,最好确保 所有的操作数都是字符串。这同样适用于加法; 如果您打算添加数字,请确保操作数是数字

您可以使用“+”运算符和prompt() 将返回的值从字符串转换为整数

var Vinitial = +prompt("What is the Velocity Initial?");
var acceleration = +prompt("what is the acceleration?");
var time = +prompt("what is the time?");

说明:

var a = prompt('Enter a digit'); 
typeof a; // "string"
typeof +a; // "number"

如果您要输入非数字数据,+a 会给您NaNtypeof NaN 也是 "number" :)

parseInt() 会得到相同的结果:

var Vinitial = parseInt(prompt("What is the Velocity Initial?"), 10);
var acceleration = parseInt(prompt("what is the acceleration?"), 10);
var time = parseInt(prompt("what is the time?"), 10);

developer.mozilla.org: parseInt(string, radix);

  • 字符串:要解析的值。

  • radix:2 到 36 之间的整数,表示上述字符串的基数(数学数字系统中的基数)。 为人类常用的十进制数字系统指定 10。 始终指定此参数以消除读者混淆并 保证可预测的行为。不同的实现产生 未指定基数时的不同结果,通常为默认值 值为 10。

结语:

Object-Oriented JavaScript - Second Edition:最安全的做法是始终指定基数。如果你省略基数,你的代码 在 99% 的情况下可能仍然有效(因为大多数情况下 你解析小数),但每隔一段时间它可能会导致你 在调试一些边缘情况时有点脱发。例如,想象 您有一个接受日历日或月的表单域,并且 用户类型 06 或 08。

结语 II:

ECMAScript 5 删除了八进制文字值并避免了混淆 使用 parseInt() 和未指定的基数。

【讨论】:

  • 这对我来说大部分都没有意义,因为我刚刚开始接触 JS,还没有学到很多东西,但我还是决定试一试。我使用“parseInt()”的问题是小数被忽略了,这可能不是很有用。所以,我最终使用了 var Vinitial = +prompt("What is the Velocity Initial?"); var acceleration = +prompt("什么是加速度?"); var time = +prompt("现在几点了?");并留下了我的其余代码。它似乎工作正常,所以我想没关系?不过谢谢你,我相信我很快就会明白的。 :)
  • @KeaneCarotenuto,是的,你是对的。 +promt() 可以在很多情况下为您提供帮助。它可以帮助你的代码更紧凑和优雅(:。你可以通过 Object-Oriented JavaScript - Second Edition 这本书来学习 JavaScript。这本书对我非常有用。
【解决方案3】:

问题是,您的值已以字符串的形式获取..因此使用 parseInt(acceleration).. 将您的值转换为 Int .. 然后它将起作用..

Vfinal = parseInt(Vinitial) + parseInt(acceleration) * parseInt(time)

【讨论】:

    【解决方案4】:
    //use ParseInt
    var a=10,b=10;
    var sum=parseInt(a+b);
    

    例如:

    parseInt(Vinitial + acceleration) * time
    

    【讨论】:

    • 它应该是var sum=parseInt(a) + parseInt(b);,你的解决方案将给出int: 1010,因为首先你将连接字符串('10'+'10' = '1010'),然后你会转换它给你int: 1010的号码
    • 是的,它给你 20,因为你有 var a=10,b=10;。将其更改为var a='10', b='10';(如主要问题所述)并再次检查
    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 2017-12-09
    • 2014-09-28
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多