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 (明らかに最小、最大、ステップ == 1,100,2)

関数gは正しいですが、渡される値に何が起こっているのかわかりません。

4

3 に答える 3

2

この表情…

min + actualmax

…が問題です。

あなたはおそらくそれを作りたいです...

+min + +actualmax

...または を使用するか、要件に合ったものを使用して、これらの文字列を実際の に変換しparseFloat()ます。parseInt()Number

jsFiddle .

JavaScript の+演算子は、算術加算と文字列連結のためにオーバーロードされています。ユーザー入力は常に文字列であるため、文字列連結を行っています。

于 2012-12-17T01:16:05.437 に答える
2

関数で使用する値は文字列です (フォームから返されるすべての値は文字列になります)。良い結果を得るには、それらを数値に変換する必要があります。これはparseFloat関数で行うことができます。

parseFloat('5') // return 5

parseInt整数が必要な場合にも使用できます (例: 浮動小数点数ではありません1.3)。ただし、常に一貫した結果を得るために、必ず基数パラメーターを設定してください。

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

Javascript+は文字列の追加と連結に記号を使用するため、これは混乱を招く可能性があります (.たとえば、PHP では記号です)。そのため、値がどのように変換されると予想されるかを JavaScript エンジンが知ることは困難です。

ちなみに、いつでもtypeofoperator を使用して変数の型をチェックアウトできます。例えば:

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 に答える