Làm cách nào tôi có thể làm tròn số trong Javascript?


228

Làm cách nào tôi có thể làm tròn số trong JavaScript?

math.round() không hoạt động vì nó làm tròn đến số thập phân gần nhất.

Tôi không chắc có cách nào tốt hơn để làm điều đó ngoài việc tách nó ra ở dấu thập phân ở việc giữ bit đầu tiên. Phải có...


21
Vòng về không hoặc hướng tới vô cực?
Daniel Brückner

Câu trả lời:



60

Vòng về phía vô cực - Math.floor()

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

Làm tròn về số 0 - thường được gọi Truncate(), nhưng không được JavaScript hỗ trợ - có thể được mô phỏng bằng cách sử dụng Math.ceil()cho số âm và Math.floor()số dương.

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

Cảm ơn bạn vì sự hoàn chỉnh nhưng viết hoa là sai ... và trong tập lệnh java tạo ra sự khác biệt lớn. Nếu không tôi sẽ nâng cấp ở đây.
George

Tôi đã cập nhật câu trả lời để viết hoa bây giờ là chính xác.
chasen

18
@George LỚN hay khổng lồ? : D
m93a

1
Bạn có thể có được hiệu ứng tương tự như làm tròn từ 0 đến 0 x | 0.
Ahmed Fasih

28

Math.floor()sẽ hoạt động, nhưng nó rất chậm so với sử dụng thao ORtác bitwise :

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

EDIT Math.floor()không chậm hơn so với sử dụng | nhà điều hành. Cảm ơn Jason S đã kiểm tra công việc của tôi.

Đây là mã tôi đã sử dụng để kiểm tra:

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
??? Tôi vừa chạy jsdb (www.jsdb.org) sử dụng Spidermonkey 1.7 và chạy một vòng lặp để tính tổng giá trị của x [i] trên một mảng gồm 100000 số dấu phẩy động, đầu tiên là Math.floor (), sau đó với bitwise hoặc như bạn đề xuất. Phải mất khoảng thời gian tương tự, 125 msec.
Jason S

4
Chỉ cần lặp lại thử nghiệm với 500000 số dấu phẩy động, mất khoảng thời gian tương đương, khoảng 625 msec.
Jason S

5
Vì vậy, tôi không thấy 1.25usec rất chậm.
Jason S

3
Không thể tranh luận với dữ liệu của bạn :) Tôi nghĩ rằng tôi có thể đã nhầm lẫn việc triển khai của JS với ActionScript (được xây dựng trên EcmaScript; rõ ràng là việc triển khai khác nhau). Cảm ơn đã kiểm tra công việc của tôi!
geraldalewis

14
Họ cũng không làm điều tương tự. |chuyển đổi thành số nguyên 32 bit, cắt ngắn; Math.floorvòng xuống. jsfiddle.net/minitech/UVG2w
Ry-

21

Bạn có thể thử sử dụng chức năng này nếu bạn cần làm tròn đến một số vị trí thập phân cụ thể

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

ví dụ

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

Tôi nghĩ rằng một lớp lót như thế này không yêu cầu chức năng.
Hubert Grzeskowiak

4
roundDown (4.56, 2) cung cấp cho bạn 4.55, vì vậy tôi không nghĩ đó là một giải pháp tốt.
khóc

6

Để làm tròn xuống về phía vô cực tiêu cực, sử dụng:

rounded=Math.floor(number);

Để làm tròn xuống 0 (nếu số có thể làm tròn thành số nguyên 32 bit trong khoảng từ -2147483648 đến 2147483647), hãy sử dụng:

rounded=number|0;

Để làm tròn xuống 0 (cho bất kỳ số nào), sử dụng:

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

5

Làm tròn numberhướng tới 0có thể được thực hiện bằng cách trừ đi phần phân số đã ký của nó number % 1:

rounded = number - number % 1;

Thích Math.floor(vòng về phía-Infinity ) phương pháp này là hoàn toàn chính xác.

Có sự khác biệt trong việc xử lý -0, +Infinity-Infinitymặc dù:

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 - Không cần nhiều Math.floor () ở đó :)
Jason Berry

18
Trên thực tế, đó là (7/8) +1 mà không phải 1. Cảm ơn đại số lớp 3
Joe Phillips

1
Umm, hãy thực sự thử điều này trong một chương trình javascript. Tôi đã làm. Hiển thị (1 + 7/8) và bạn sẽ thấy 1.875. Math.round (...) là 2, Math.floor (...) là 1. Các bạn đang nói về cái gì?
DigitalRoss

1
Hoặc mở Bảng điều khiển lỗi Firefox. Hoặc Bọ lửa. Không khó để thử. Tôi đã thử nó. 1 + 7/8 là 1.875 trong js. Bạn có thể quên rằng tất cả toán học trong js đều ở điểm nổi?
DigitalRoss

3
Có lẽ thật dễ dàng để quên rằng javascript làm mọi thứ trong dấu chấm động. Trong nhiều ngôn ngữ khác 1 + 7/8 là 1, nhưng trong js nó thực sự là 1.875.
DigitalRoss

3

Hôm nay đã đấu tranh với mã của ai đó và tìm thấy những điều sau đây dường như cũng làm tròn:

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

Để biết thêm thông tin về dịch chuyển bên phải ký hiệu (>>), hãy xem Toán tử bit theo MDN

Phải mất một thời gian tôi mới biết được việc này đang làm gì: D

Nhưng như được nhấn mạnh ở trên, Math.floor () hoạt động và trông dễ đọc hơn theo quan điểm của tôi.


3
Nó cũng âm thầm giết số của bạn nếu nó không vừa trong 32 bit. Bảng điều khiển Chromium: 99999999999999999999999 | 0 => -167772160
Matthias Urlichs

0

Bạn cần đặt -1 để làm tròn xuống một nửa và sau đó nhân với -1 như ví dụ dưới đây.

<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>

Thành thật Trong cộng đồng này, chúng tôi thích các câu trả lời như @phoebus được đưa ra ở trên.
Ankit Pandey

0

Đây là math.floor đang được sử dụng trong một ví dụ đơn giản. Điều này có thể giúp một nhà phát triển mới có được ý tưởng về cách sử dụng nó trong một chức năng và những gì nó làm. Hy vọng nó giúp!

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.