Javascript:与算术运算符不一致?

时间:2017-05-23 14:22:05

标签: javascript

背景:在芬兰,学校的传统评分系统是基于数字和减号/加号。如果学生得到6+,则等于6.25,6-等于5.75。

我有以下代码:



function miinustin() {
  var vanha = $('#summa').val();
  var valiUusi = vanha.slice(0, -1);
  var vikamerkki = vanha.slice(-1);
  if (vikamerkki === "-") {
    var uusi = valiUusi - 0.25;
    $('#summa').val(uusi);
  } else if (vikamerkki === "+") {
    var uusi = valiUusi + 0.25;
    $('#summa').val(uusi);
  } else if (vikamerkki === "½") {
    var uusi = valiUusi + 0.5;
    $('#summa').val(uusi);
  }
};

$('#summa').on("input", miinustin);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" value="" id="summa">
&#13;
&#13;
&#13;

为什么6-变为5.756+变为60.25变为60.50,如何解决此问题?我确实意识到else if语句0.25语句0.50和{{1}}由于某种原因不被视为数值,但为什么?

4 个答案:

答案 0 :(得分:2)

看起来值valiUusivikamerkki都是字符串,这意味着JavaScript会尝试连接0.250.5,而不是添加或减去它们。< / p>

解决方案是在使用parseInt之前将这些值转换为数字:

&#13;
&#13;
function miinustin() {
  var vanha = $('#summa').val();
  var valiUusi = parseInt(vanha.slice(0, -1), 10);
  var vikamerkki = vanha.slice(-1);

  if (vikamerkki === "-") {
    var uusi = valiUusi - 0.25;
    $('#summa').val(uusi);
  } else if (vikamerkki === "+") {
    var uusi = valiUusi + 0.25;
    $('#summa').val(uusi);
  } else if (vikamerkki === "½") {
    var uusi = valiUusi + 0.5;
    $('#summa').val(uusi);
  }
};

$('#summa').on("input", miinustin);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" value="" id="summa">
&#13;
&#13;
&#13;

答案 1 :(得分:2)

如果其中一个操作数是一个字符串,那么带有加号oparator的表达式的结果就是一个字符串。

另外,您需要将字符串(输入)转换为数字。一种简单的方法是将加号前置为unary plus以获取所有操作的数字。

var valiUusi = +vanha.slice(0, -1);
//             ^ unary +

function miinustin() {
  var vanha = $('#summa').val();
  var valiUusi = +vanha.slice(0, -1);
  var vikamerkki = vanha.slice(-1);
  if (vikamerkki === "-") {
    var uusi = valiUusi - 0.25;
    $('#summa').val(uusi);
  } else if (vikamerkki === "+") {
    var uusi = valiUusi + 0.25;
    $('#summa').val(uusi);
  } else if (vikamerkki === "½") {
    var uusi = valiUusi + 0.5;
    $('#summa').val(uusi);
  }
};

$('#summa').on("input", miinustin);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" value="" id="summa">

答案 2 :(得分:0)

JavaScript是动态类型语言。

var vanha = $('#summa').val(); // Is a String 
var valiUusi = vanha.slice(0, -1); // Is a String

在脚本执行期间根据需要自动转换数据类型

When you do  var uusi = valiUusi + 0.25; //

valiUusi被视为字符串 - In expressions involving numeric and string values with the + operator, JavaScript converts numeric values to strings

因此该值变为 60.25

然而,在涉及其他而不是&#34; +&#34;的声明中运算符,JavaScript不会将数值转换为字符串

因此var uusi = valiUusi + 0.25;变成5.75

The correct way to approach is to use : parseInt or parseFloat()

进一步阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types

答案 3 :(得分:0)

感谢您指出我的代码无效的原因!

我发现(在知道谷歌的内容之后)这也有效:

var valiUusi = vanha.slice(0, -1); 
valiUusi = Number(valiUusi);

现在,脚本按预期工作:按下每个时间-,从文本字段中的值中扣除0.25+½也有效。