Javascript에서 숫자를 어떻게 내릴 수 있습니까?


228

JavaScript에서 숫자를 어떻게 내릴 수 있습니까?

math.round() 가장 가까운 10 진수로 반올림하기 때문에 작동하지 않습니다.

첫 번째 비트를 유지할 때 소수점에서 분리하는 것보다 더 좋은 방법이 있는지 확실하지 않습니다. 있어야합니다 ...


21
0 또는 음의 무한대로 반올림합니까?
Daniel Brückner

답변:



60

음의 무한대로 반올림- Math.floor()

+3.5 => +3.0
-3.5 => -4.0

0으로 반올림 (보통 Truncate()JavaScript에서는 지원되지 않음) Math.ceil()은 음수 및 Math.floor()양수를 사용하여 에뮬레이션 할 수 있습니다 .

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()

완전성에 감사하지만 대문자는 잘못되었습니다 ...와 자바 스크립트에서 큰 차이를 만듭니다. 그렇지 않으면 나는 여기에서 upvoted했을 것입니다.
George

대문자가 올바르게 표시되도록 답변을 업데이트했습니다.
chasen

18
@ 조지 거대 또는 거대? : D
m93a

1
via를 0으로 반올림하는 것과 같은 효과를 얻을 수 있습니다 x | 0.
Ahmed Fasih

28

Math.floor()작동하지만 비트 OR연산 을 사용하는 것과 비교할 때 매우 느립니다 .

var rounded = 34.923 | 0;
alert( rounded );
//alerts "34"

편집이 Math.floor() 입니다 하지 를 사용하는 것보다 속도가 느린 | 운영자. 작업을 확인한 Jason S에게 감사합니다.

테스트하는 데 사용한 코드는 다음과 같습니다.

var a = [];
var time = new Date().getTime();
for( i = 0; i < 100000; i++ ) {
    //a.push( Math.random() * 100000  | 0 );
    a.push( Math.floor( Math.random() * 100000 ) );
}
var elapsed = new Date().getTime() - time;
alert( "elapsed time: " + elapsed );

11
??? 방금 Spidermonkey 1.7을 사용하는 jsdb (www.jsdb.org)를 실행하고 루프를 실행하여 처음에는 Math.floor ()를 사용하여 100000 개의 부동 소수점 숫자 배열에서 x [i]의 바닥 값을 요약했습니다. 그런 다음 비트 단위 또는 제안한대로. 약 125msec의 시간이 걸렸습니다.
Jason S

4
500000 개의 부동 소수점 숫자로 테스트를 반복하면 대략 625msec의 시간이 거의 걸렸습니다.
Jason S

5
그래서 1.25usec가 얼마나 느린 지 모르겠습니다.
Jason S

3
귀하의 데이터와 논쟁 할 수 없습니다. 내 작업을 확인해 주셔서 감사합니다!
geraldalewis

14
그들은 똑같은 일도하지 않습니다. |32 비트 정수로 변환하여 잘립니다. Math.floor반올림합니다. jsfiddle.net/minitech/UVG2w
Ry-

21

특정 소수점 이하 자릿수로 내림해야하는 경우이 기능을 사용할 수 있습니다.

function roundDown(number, decimals) {
    decimals = decimals || 0;
    return ( Math.floor( number * Math.pow(10, decimals) ) / Math.pow(10, decimals) );
}

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990

나는 이것과 같은 하나의 라이너가 기능을 필요로하지 않는다고 생각합니다.
허버트 Grzeskowiak

4
roundDown (4.56, 2)은 4.55를 제공하므로 좋은 해결책이라고 생각하지 않습니다.
울음

6

음의 무한대를 향해 반올림하려면 다음을 사용하십시오.

rounded=Math.floor(number);

0으로 반 내림하려면 (숫자가 -2147483648과 2147483647 사이의 32 비트 정수로 반올림 될 수있는 경우) 다음을 사용하십시오.

rounded=number|0;

숫자를 0으로 반올림하려면 다음을 사용하십시오.

if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number);

5

부호있는 분수 부분을 빼면을 number향해 반올림 0할 수 있습니다 number % 1.

rounded = number - number % 1;

마찬가지로 Math.floor(대한 라운드 -Infinity)이 방법은 완벽하게 정확합니다.

이 취급의 차이는 -0, +Infinity그리고 -Infinity비록 :

Math.floor(-0) => -0
-0 - -0 % 1    => +0

Math.floor(Infinity)    => Infinity
Infinity - Infinity % 1 => NaN

Math.floor(-Infinity)     => -Infinity
-Infinity - -Infinity % 1 => NaN

3
Math.floor(1+7/8)

1 + 7 / 8 = 1-Math.floor ()가별로 필요하지 않음 :)
Jason Berry

18
실제로 그것은 1이 아닌 (7/8) +1입니다. 감사합니다 3 학년 대수
Joe Phillips

1
음, 실제로 자바 스크립트 프로그램에서 시도하십시오. 나는했다. (1 + 7/8)을 표시하면 1.875가 표시됩니다. Math.round (...)는 2이고 Math.floor (...)는 1입니다.
DigitalRoss

1
또는 Firefox 오류 콘솔을여십시오. 또는 Firebug. 시도하기 어렵지 않습니다. 나는 그것을 시도했다. 1 + 7/8은 js에서 1.875입니다. js의 모든 수학이 부동 소수점에 있다는 것을 잊었습니까?
DigitalRoss

3
자바 스크립트가 부동 소수점으로 모든 것을 수행한다는 것을 잊어 버릴 수 있습니다. 다른 많은 언어 에서는 1 + 7 / 8이 1이지만 js에서는 실제로 1.875입니다.
DigitalRoss

3

오늘 다른 사람의 코드를 다루고 있었고 다음과 같은 것을 발견했습니다.

var dec = 12.3453465,
int = dec >> 0; // returns 12

부호 전파 오른쪽 이동 (>>)에 대한 자세한 내용은 MDN 비트 연산자를 참조하십시오.

이 작업을 수행하는 데 시간이 걸렸습니다.

그러나 위에서 강조한 것처럼 Math.floor ()는 작동하며 내 의견으로는 더 읽기 쉽습니다.


3
또한 32 비트에 맞지 않으면 자동으로 번호를 죽입니다. 크롬 콘솔 : 99999999999999999999999 | 0 => -167772160
Matthias Urlichs

0

반 아래로 반올림하려면 -1을 넣고 그 아래에 아래 예제와 같이 -1을 곱하십시오.

<script type="text/javascript">

  function roundNumber(number, precision, isDown) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = 0;
    if (isDown) {
      tempNumber = -tempNumber;
      roundedTempNumber = Math.round(tempNumber) * -1;
    } else {
      roundedTempNumber = Math.round(tempNumber);
    }
    return roundedTempNumber / factor;
  }
</script>

<div class="col-sm-12">
  <p>Round number 1.25 down: <script>document.write(roundNumber(1.25, 1, true));</script>
  </p>
  <p>Round number 1.25 up: <script>document.write(roundNumber(1.25, 1, false));</script></p>
</div>

솔직히이 커뮤니티에서는 위의 @phoebus와 같은 답변을 선호합니다.
Ankit Pandey

0

다음은 간단한 예제에서 사용되는 math.floor입니다. 이것은 새로운 개발자가 함수에서 그것을 사용하는 방법과 기능에 대한 아이디어를 얻는 데 도움이 될 수 있습니다. 그것이 도움이되기를 바랍니다!

<script>

var marks = 0;

function getRandomNumbers(){    //  generate a random number between 1 & 10
    var number = Math.floor((Math.random() * 10) + 1);
    return number;
}

function getNew(){  
/*  
    This function can create a new problem by generating two random numbers. When the page is loading as the first time, this function is executed with the onload event and the onclick event of "new" button.
*/
document.getElementById("ans").focus();
var num1 = getRandomNumbers();
var num2 = getRandomNumbers();
document.getElementById("num1").value = num1;
document.getElementById("num2").value = num2;

document.getElementById("ans").value ="";
document.getElementById("resultBox").style.backgroundColor = "maroon"
document.getElementById("resultBox").innerHTML = "***"

}

function checkAns(){
/*
    After entering the answer, the entered answer will be compared with the correct answer. 
        If the answer is correct, the text of the result box should be "Correct" with a green background and 10 marks should be added to the total marks.
        If the answer is incorrect, the text of the result box should be "Incorrect" with a red background and 3 marks should be deducted from the total.
        The updated total marks should be always displayed at the total marks box.
*/

var num1 = eval(document.getElementById("num1").value);
var num2 = eval(document.getElementById("num2").value);
var answer = eval(document.getElementById("ans").value);

if(answer==(num1+num2)){
    marks = marks + 10;
    document.getElementById("resultBox").innerHTML = "Correct";
    document.getElementById("resultBox").style.backgroundColor = "green";
    document.getElementById("totalMarks").innerHTML= "Total marks : " + marks;

}

else{
    marks = marks - 3;
    document.getElementById("resultBox").innerHTML = "Wrong";
    document.getElementById("resultBox").style.backgroundColor = "red";
    document.getElementById("totalMarks").innerHTML = "Total Marks: " + marks ;
}




}

</script>
</head>

<body onLoad="getNew()">
    <div class="container">
        <h1>Let's add numbers</h1>
        <div class="sum">
            <input id="num1" type="text" readonly> + <input id="num2" type="text" readonly>
        </div>
        <h2>Enter the answer below and click 'Check'</h2>
        <div class="answer">
            <input id="ans" type="text" value="">
        </div>
        <input id="btnchk" onClick="checkAns()" type="button" value="Check" >
        <div id="resultBox">***</div>
        <input id="btnnew" onClick="getNew()" type="button" value="New">
        <div id="totalMarks">Total marks : 0</div>  
    </div>
</body>
</html>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.