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
-
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, thenMath.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
4 Answers
Reset to default 4Math.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.