最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Javascript - Math.floor does not work - Stack Overflow

programmeradmin5浏览0评论

I know there are more of the "Math.floor not working" questions, but I didn't found my answer there, so that's why I made this question.

I am making a simple algorithm which is looking for your number by jumping in between the range. So for example, range = 100, number = 60. It will go to 50, see it's higher, so the range is 50 - 100. then it jumps to 75 to see if it's either bigger or smaller, and so on until it found the right number.

To make this a bit more clear, I thought: "I'll round them downwards by using Math.floor." But for some reason it doesn't work.

My code:

var guessTheNumber = function() {

  var validNumber = false; // Geldig nummer = niet waar
  var userNumberHTML = document.getElementById("userNumberHTML"); // Noem HTML element met ID "userNumberHTML" "userNumberHTML"
  var guessedNumbers = document.getElementById("guessedNumbers"); // noem HTML element met ID "guessedNumbers" "guessedNumbers"
  guessedNumbers.innerHTML = "Guessed number(s): ";
  var minNumber = 0; // Minimum wat mensen kunnen invullen
  var maxNumber = 100; // Maximum wat mensen kunnen invullen
  var userNumber = prompt("Tell me a number between 0 and 100, including those (numbers with decimals will be rounded downwards)."); // Vraag gebruiker welk nummer
  userNumber = Math.floor(userNumber); // Nummer wordt naar beneden afgerond
  var counter = 1;
  var result = 0;
  var q = 1;

  if (userNumber >= minNumber && userNumber <= maxNumber) { // Als het een getal is groter of gelijk aan 1 en kleiner of gelijk aan 100
    userNumberHTML.innerHTML = "Your number: " + userNumber; // Geef "x" in HTML de waarde van "userNumber", namelijk het genoemde getal
  } else { // Anders
    while (validNumber == false) { // Zolang validNumber NIET waar is
      userNumber = prompt("This is not a number between 0 and 100. Try again."); // wordt "userNumber" de waarde van de nieuwe prompt
      if (userNumber >= 1 && userNumber <= 100) { // Als het een getal is groter of gelijk aan 1 en kleiner of gelijk aan 100
        userNumberHTML.innerHTML = "Your number: " + userNumber; // Geef "x" in HTML de waarde van "userNumber", namelijk het zojuist genoemde getal
        validNumber = true; // Zet validNumber op WEL waar
      }
    }
  }

  result = (minNumber + maxNumber) / 2;
  Math.floor(result);
  guessedNumbers.innerHTML += result + ", ";

  while (result != userNumber) {
    if (result < userNumber) {
      Math.floor(result);
      minNumber = result;
    } else {
      Math.floor(result);
      maxNumber = result;
    }
    result = (minNumber + maxNumber) / 2;
    guessedNumbers.innerHTML += result + ", ";
    q++;
  }

  guessedNumbers.innerHTML += "and there you go!";
  alert("The PC guessed your number in " + q + " times!");
  if (confirm("Try again?")) {
    guessedNumbers.innerHTML = "Guessed number(s): ";
    guessTheNumber();
  }
}
<!DOCTYPE html>
<html>

<head>
  <title>JS test</title>
</head>

<body>
  <button onclick="guessTheNumber()" style="height: 100px; width: 200px;">Let the Computer find your number!</button>
  <p id="userNumberHTML">Your number: </p>
  <p id="guessedNumbers">Guessed number(s): </p>
  <p id="TEST"></p>

  <!-- SCRIPTS -->
  <!-- <script type="text/javascript" src="guessTheNumber.js"></script> -->
  <script type="text/javascript" src="test.js"></script>
</body>

</html>

I know there are more of the "Math.floor not working" questions, but I didn't found my answer there, so that's why I made this question.

I am making a simple algorithm which is looking for your number by jumping in between the range. So for example, range = 100, number = 60. It will go to 50, see it's higher, so the range is 50 - 100. then it jumps to 75 to see if it's either bigger or smaller, and so on until it found the right number.

To make this a bit more clear, I thought: "I'll round them downwards by using Math.floor." But for some reason it doesn't work.

My code:

var guessTheNumber = function() {

  var validNumber = false; // Geldig nummer = niet waar
  var userNumberHTML = document.getElementById("userNumberHTML"); // Noem HTML element met ID "userNumberHTML" "userNumberHTML"
  var guessedNumbers = document.getElementById("guessedNumbers"); // noem HTML element met ID "guessedNumbers" "guessedNumbers"
  guessedNumbers.innerHTML = "Guessed number(s): ";
  var minNumber = 0; // Minimum wat mensen kunnen invullen
  var maxNumber = 100; // Maximum wat mensen kunnen invullen
  var userNumber = prompt("Tell me a number between 0 and 100, including those (numbers with decimals will be rounded downwards)."); // Vraag gebruiker welk nummer
  userNumber = Math.floor(userNumber); // Nummer wordt naar beneden afgerond
  var counter = 1;
  var result = 0;
  var q = 1;

  if (userNumber >= minNumber && userNumber <= maxNumber) { // Als het een getal is groter of gelijk aan 1 en kleiner of gelijk aan 100
    userNumberHTML.innerHTML = "Your number: " + userNumber; // Geef "x" in HTML de waarde van "userNumber", namelijk het genoemde getal
  } else { // Anders
    while (validNumber == false) { // Zolang validNumber NIET waar is
      userNumber = prompt("This is not a number between 0 and 100. Try again."); // wordt "userNumber" de waarde van de nieuwe prompt
      if (userNumber >= 1 && userNumber <= 100) { // Als het een getal is groter of gelijk aan 1 en kleiner of gelijk aan 100
        userNumberHTML.innerHTML = "Your number: " + userNumber; // Geef "x" in HTML de waarde van "userNumber", namelijk het zojuist genoemde getal
        validNumber = true; // Zet validNumber op WEL waar
      }
    }
  }

  result = (minNumber + maxNumber) / 2;
  Math.floor(result);
  guessedNumbers.innerHTML += result + ", ";

  while (result != userNumber) {
    if (result < userNumber) {
      Math.floor(result);
      minNumber = result;
    } else {
      Math.floor(result);
      maxNumber = result;
    }
    result = (minNumber + maxNumber) / 2;
    guessedNumbers.innerHTML += result + ", ";
    q++;
  }

  guessedNumbers.innerHTML += "and there you go!";
  alert("The PC guessed your number in " + q + " times!");
  if (confirm("Try again?")) {
    guessedNumbers.innerHTML = "Guessed number(s): ";
    guessTheNumber();
  }
}
<!DOCTYPE html>
<html>

<head>
  <title>JS test</title>
</head>

<body>
  <button onclick="guessTheNumber()" style="height: 100px; width: 200px;">Let the Computer find your number!</button>
  <p id="userNumberHTML">Your number: </p>
  <p id="guessedNumbers">Guessed number(s): </p>
  <p id="TEST"></p>

  <!-- SCRIPTS -->
  <!-- <script type="text/javascript" src="guessTheNumber.js"></script> -->
  <script type="text/javascript" src="test.js"></script>
</body>

</html>

I do really not know what I am doing wrong, since the user input does Math.floor like it should! Any help is appreciated :)

Thanks in advance,
Brent

Share Improve this question edited Jul 9, 2017 at 14:51 Brent Meeusen asked Jul 9, 2017 at 14:21 Brent MeeusenBrent Meeusen 2593 silver badges14 bronze badges 3
  • Have you tried dropping in a few console.log() calls to see how your numbers are changing as the loop runs? – Pointy Commented Jul 9, 2017 at 14:24
  • One extra thing to note besides what the answers say, Math.Floor is for rounding down decimals. If you have an integer you want to round to the nearest 10 for example, then Math.Floor won't do anything. – steliosbl Commented Jul 9, 2017 at 14:26
  • @stybl He's dividing by 2, so it's for removing the fraction if the number is odd. – Barmar Commented Jul 9, 2017 at 14:30
Add a ment  | 

4 Answers 4

Reset to default 4

Math.floor(result) returns the result, so you have to use:

result = Math.floor(result);

Javascript parameters are passed by value, not by reference, so the function can't modify the parameter variable. You have to assign the result:

result = Math.floor(result);

You wrote

Math.floor(result);

but it will not modify result and thus have no effect
Consider using

result = Math.floor(result);

instead

This is because your userNumber is a string. Just use parseInt(userNumber) and it should work. You should also add some kind of input type control!


Edit: As others have pointed out, you also have to assign the value to the variable. I just saw the first use Math.floor() and thought that was the only problem.

To sum up, you should have: userNumber = Math.floor(parseInt(userNumber)) at first, so you do not get a NaN, and then use result = Math.floor(result) to get the proper value.

发布评论

评论列表(0)

  1. 暂无评论