【问题标题】:Incorrect result in JavaScript calculation [duplicate]JavaScript 计算结果不正确
【发布时间】:2016-01-01 22:38:01
【问题描述】:

我是 JavaScript 的新手,想将我的一个计算电子表格转换为我可以在网页上使用的东西。但是,计算得出的结果不正确。

这是我的 JavaScript:

<script type="text/javascript" language="JavaScript">
        function calc() {
            var onerepmax = document.wodCalculate.oneRepMax.value;
            var percent = document.wodCalculate.percentOfOneRepMax.value / 100;
            var addkg = document.wodCalculate.plusKg.value;
            var zwischenschritt = onerepmax * percent;
            var gewicht = zwischenschritt + addkg;
            document.getElementById("weight").innerHTML = gewicht;
        };
</script>

这是 HTML:

<form action="" id="wodCalculate" name="wodCalculate">
        <table cellspacing="0" cellpadding="10" border="0">
            <tr><td>1 Rep Max</td><td><input type=text name="oneRepMax" value="">&nbsp;kg<br></td></tr>
            <tr><td>% vom 1RM</td><td><input type=text name="percentOfOneRepMax" value="">&nbsp;%<br></td></tr>
            <tr><td>Plus x kg</td><td><input type=text name="plusKg" value="">&nbsp;kg<br></td></tr>
            <tr><td><input type="button" value="Calculate" onClick="calc()"></td></tr>
        </table>
</form>
<div id="weight">Weight</div>

直到将“onerepmax”乘以“百分比”为止,它都可以正常工作。但是,一旦将“addkg”添加到乘法结果中(即给我“gewicht”),结果就会不正确。

例如,我想得到 100kg 的 10%,再加上 10kg。不是20kg,而是1010。

感谢您的帮助!

【问题讨论】:

标签: javascript calc


【解决方案1】:

inputvalue 始终是一个字符串,因此 + 最终成为字符串连接("10" + "10""1010",而 10 + 1020)。

如果您使用的是input type="number"(OP 不是,但其他人发现此答案可能)并且浏览器支持它们,您可以改用valueAsNumber

var onerepmax = document.wodCalculate.oneRepMax.valueAsNumber;

如果你使用type="text"或者浏览器不支持valueAsNumber

如果用户输入的值是整数,您可以使用 parseInt(value, 10)(10 = 十进制,以 10 为底)转换用户输入值,例如:

var onerepmax = parseInt(document.wodCalculate.oneRepMax.value, 10);

这只是一种选择,但您有多种选择:

  • 一元 + 运算符:value = +value 将使用 JavaScript 引擎的标准规则将字符串强制转换为数字。该数字可以有小数部分(例如,+"1.50"1.5)。字符串中的任何非数字(科学记数法的e 除外)都会产生NaN。另外,+""0,这可能不直观。

    var onerepmax = +document.wodCalculate.oneRepMax.value;
    
  • Number 函数:value = Number(value)。与+ 做同样的事情。

    var onerepmax = Number(document.wodCalculate.oneRepMax.value);
    
  • parseInt 函数,通常带有基数(数字基数):value = parseInt(value, 10)。这里的缺点是parseInt 转换它在字符串开头找到的任何数字,但忽略 字符串后面的非数字,所以parseInt("100asdf", 10)100,而不是NaN。顾名思义,parseInt 只解析一个整数。

    // (Same as the first one above)
    var onerepmax = parseInt(document.wodCalculate.oneRepMax.value, 10);
    
  • parseFloat 函数:value = parseFloat(value)。允许小数值,并且始终以十进制工作(从不使用八进制或十六进制)。 parseInt 对字符串末尾的垃圾做同样的事情,parseFloat("123.34alksdjf")123.34

    var onerepmax = parseFloat(document.wodCalculate.oneRepMax.value);
    

因此,请选择适合您用例的工具。 :-)

【讨论】:

  • 干得好,T.J.克劳德
【解决方案2】:

问题是你“添加”的是一个字符串,而不是一个数字。 JavaScript 中的+ 运算符具有多种语义,只要一个操作数是字符串,就会进行字符串连接。

为防止这种情况发生,请使用一元 + 运算符将字符串转换为数字。

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 2017-07-02
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多