2

我使用 Javascript 的第一天,我非常困惑。我将从表单返回的数字传递给函数,但结果与应有的不一致。我的测试还有很多不足之处,但希望以下内容有意义。

该函数g计算序列的总和。

 <form name="gaussform">
    <input name="min" 
           type="number"
           min="1"
           value="1">
    <input name="max" 
           type="number"
           min="2"
           value="10">
    <input name="step" 
           type="number"
           min="1"
           value="1">
    <input onclick="alert_g()"
           type="submit"
           value="calculate">
  </form>

  <script type="text/javascript">

    function g(min,max,step) {
    var actualmax = max - ((max - min) % step)
    return (min + actualmax) * ((1 + ((actualmax - min) / step)) / 2)
    }

    function alert_g() {
    var frm = document.forms["gaussform"]
    var min = frm["min"].value
    var max = frm["max"].value
    var step = frm["step"].value
    if (min == 1) {
    alert("min is 1")}
    if (max == 10) {
    alert("max is 10")}
    if (step == 1) {
    alert("step is 1")}
    alert(g(min,max,step))
    // below returns the desired result
    alert(g(1,10,1))}
  </script>

if 语句只是为了让我能理解发生了什么!

因此,如果用户输入 1,10,1(默认值),结果应该是 55。

alert(g(1,10,1))-> 55

alert(g(min,max,step)-> 550

alert(g(1,100,2))-> 2500

alert(g(min,max,step)-> 4975(显然 min,max,step == 1,100,2)

该函数g是正确的,但我不明白传递给它的值发生了什么。

4

3 回答 3

2

这个表情...

min + actualmax

……是问题所在。

你可能想让那个...

+min + +actualmax

...或使用parseFloat()parseInt()或任何适合您的要求将这些字符串变成实际的Number.

js小提琴

JavaScript 的+运算符被重载用于算术加法和字符串连接。因为用户输入始终是字符串,所以您正在执行字符串连接。

于 2012-12-17T01:16:05.437 回答
2

您在函数中使用的值是字符串(表单返回的每个值都是字符串)。您需要将它们转换为数字才能获得良好的结果。这可以通过parseFloat函数来​​完成。

parseFloat('5') // return 5

parseInt如果您想要整数(没有浮点数,例如:),也可以使用1.3,但请务必设置 radix 参数以始终获得一致的结果。

parseInt('5', 10) // return 5

这可能会令人困惑,因为 Javascript 使用+符号来添加和连接字符串(.例如,在 PHP 中是符号)。因此,javascript 引擎很难知道一个值是如何被转换的。

顺便说一句,您始终可以使用typeof运算符来检查变量的类型。例如:

typeof '5' // ouput: String
typeof 5   // output: Number
于 2012-12-17T01:20:29.667 回答
0

alert(g(parseInt(min),parseInt(max),parseInt(step)))已经解决了!

但显然这是不好的形式。看评论...

alert(g(parseInt(min,10),parseInt(max,10),parseInt(step,10)))也许?

于 2012-12-17T01:20:39.320 回答