ฉันจะปัดเศษตัวเลขใน Javascript ได้อย่างไร


228

ฉันจะปัดเศษตัวเลขลงใน JavaScript ได้อย่างไร

math.round() ไม่ทำงานเพราะมันปัดเศษเป็นทศนิยมที่ใกล้ที่สุด

ฉันไม่แน่ใจว่ามีวิธีที่ดีกว่าในการทำมันนอกเหนือจากการแยกมันออกจากกันที่จุดทศนิยมที่เก็บบิตแรก จะต้องมี ...


21
ปัดไปทางศูนย์หรือไปทางอนันต์ลบ?
Daniel Brückner

คำตอบ:


422

การใช้ Math.floor()เป็นวิธีหนึ่งในการทำเช่นนี้

ข้อมูลเพิ่มเติม: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor


2
มันเป็นวิธีที่ช้าที่สุด; หากคุณต้องการดำเนินการสิ่งเหล่านี้จำนวนมากให้ใช้ bitwise | ผู้ประกอบการ (ดูโพสต์ของฉัน)
geraldalewis

12
The | ตัวดำเนินการยังปัดเศษเป็นศูนย์ไม่ใช่อินฟินิตี้ลบ
Mike Godin

60

ปัดไปทางลบอนันต์ - Math.floor()

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

ปัดเศษเป็นศูนย์ - มักเรียกว่าTruncate()แต่ไม่รองรับ JavaScript - สามารถเลียนแบบได้โดยใช้Math.ceil()สำหรับจำนวนลบและMath.floor()ตัวเลขบวก

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

ขอบคุณสำหรับความสมบูรณ์ แต่การใช้อักษรตัวพิมพ์ใหญ่ผิด ... และในจาวาสคริปต์ที่สร้างความแตกต่างอย่างมาก มิฉะนั้นฉันจะ upvoted ที่นี่
จอร์จ

ฉันได้อัปเดตคำตอบเพื่อให้การใช้อักษรตัวพิมพ์ใหญ่นั้นถูกต้องแล้ว
chasen

18
@ George ขนาดใหญ่หรือใหญ่? : D
m93a

1
คุณสามารถรับเอฟเฟกต์แบบเดียวกันกับการปัดเศษเป็นศูนย์ผ่าน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
??? ฉันเพิ่งวิ่ง jsdb (www.jsdb.org) ซึ่งใช้ Spidermonkey 1.7 และวิ่งวนไปหาผลรวมของค่าของ floor [x] ในอาร์เรย์ของจำนวนจุดลอยตัว 100000 อันดับแรกด้วย Math.floor () จากนั้นตามด้วยบิตหรือตามที่คุณแนะนำ ใช้เวลาประมาณ 125 มิลลิวินาที
46432 Jason Jason S

4
เพิ่งทดสอบซ้ำโดยมีตัวเลขจุดลอยตัว 500,000 จุดใช้เวลาประมาณเดียวกันโดยประมาณ 625 มิลลิวินาที
46499 Jason S

5
ดังนั้นฉันไม่เห็นว่า 1.25usec ช้ามากเพียงใด
46499 Jason S

3
ไม่สามารถโต้เถียงกับข้อมูลของคุณได้ :) ฉันคิดว่าฉันอาจสับสนกับการนำ JS ไปใช้กับ ActionScript (สร้างขึ้นบน EcmaScript; ขอบคุณสำหรับการตรวจสอบงานของฉัน!
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

ฉันคิดว่าหนึ่งซับในแบบนี้ไม่จำเป็นต้องใช้ฟังก์ชั่น
Hubert Grzeskowiak

4
roundDown (4.56, 2) ให้คุณ 4.55 ดังนั้นฉันไม่คิดว่ามันจะเป็นทางออกที่ดี
cryss

6

ในการปัดเศษลงไปหาอนันต์ลบให้ใช้:

rounded=Math.floor(number);

หากต้องการปัดเศษเป็นศูนย์ (หากตัวเลขสามารถปัดเป็นจำนวนเต็ม 32 บิตระหว่าง -2147483648 ถึง 2147483647) ให้ใช้:

rounded=number|0;

หากต้องการปัดเศษเป็นศูนย์ (สำหรับหมายเลขใด ๆ ) ให้ใช้:

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

5

การปัดเศษ a 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 + 8/7 = 1 - ไม่จำเป็นต้องไม่มากสำหรับ Math.Floor () มี :)
เจสันแบล็กเบอร์

18
จริงๆแล้วมันเป็น (7/8) 1 ซึ่งไม่ได้เป็น 1. ขอบคุณพีชคณิตชั้นประถมศึกษาปีที่ 3
โจฟิลลิป

1
อืมโปรดลองสิ่งนี้ในโปรแกรมจาวาสคริปต์ ฉันทำ. แสดง (1 + 7/8) แล้วคุณจะเห็น 1.875 Math.round (... ) คือ 2, Math.floor (... ) คือ 1 พวกคุณพูดถึงอะไร
DigitalRoss

1
หรือเปิด Firefox Error Console หรือ Firebug ไม่ยากที่จะลอง ฉันลองแล้ว 1 + 7/8 คือ 1.875 ใน js คุณอาจลืมไปว่าคณิตศาสตร์ทั้งหมดใน js อยู่ในจุดลอยตัวหรือไม่?
DigitalRoss

3
มันอาจจะง่ายที่จะลืมว่า javascript ทำทุกอย่างในจุดลอยตัว ในภาษาอื่น ๆอีกมากมาย1 + 7/8 คือ 1 แต่ใน js มันคือ 1.875
DigitalRoss

3

เล่นรอบกับคนอื่นรหัสวันนี้และพบสิ่งต่อไปนี้ซึ่งดูเหมือนจะลดลงเช่นกัน:

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเลื่อนขวาของการส่งสัญญาณ (>>) ดูตัวดำเนินการ MDN Bitwise

ฉันใช้เวลาสักพักกว่าจะได้ผลว่าทำอะไรอยู่: D

แต่ดังที่ไฮไลต์ด้านบน Math.floor () ทำงานได้และดูง่ายขึ้นในความคิดของฉัน


3
มันจะฆ่าหมายเลขของคุณอย่างเงียบ ๆ หากมันไม่พอดีกับ 32 บิต Chromium console: 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.