Javascript: Làm tròn đến bội số tiếp theo của 5


113

Tôi cần một hàm tiện ích nhận vào một giá trị số nguyên (có độ dài từ 2 đến 5 chữ số) làm tròn đến bội số tiếp theo của 5 thay vì bội số gần nhất của 5. Đây là những gì tôi nhận được:

function round5(x)
{
    return (x % 5) >= 2.5 ? parseInt(x / 5) * 5 + 5 : parseInt(x / 5) * 5;
}

Khi tôi chạy round5(32), nó cho tôi 30, nơi tôi muốn 35.
Khi tôi chạy round5(37), nó cho tôi 35, nơi tôi muốn 40.

Khi tôi chạy round5(132), nó cho tôi 130, nơi tôi muốn 135.
Khi tôi chạy round5(137), nó cho tôi 135, nơi tôi muốn 140.

Vân vân...

Làm thế nào để tôi làm điều này?


3
Nên round5(5)cho 5, hay 10?
user2357112 hỗ trợ Monica

1
Làm thế nào về: chia x cho 5, làm tròn đến số nguyên gần nhất (sử dụng hàm Math.ceil) và sau đó nhân với 5?
Martin Wilson

2
round5 (5) nên cung cấp cho 5
Amit Erandole

Câu trả lời:


271

Điều này sẽ thực hiện công việc:

function round5(x)
{
    return Math.ceil(x/5)*5;
}

Nó chỉ là một biến thể của phép làm tròn thông thường numberđến bội số gần nhất của xhàm Math.round(number/x)*x, nhưng sử dụng .ceilthay vì .roundlàm cho nó luôn làm tròn lên thay vì xuống / lên theo các quy tắc toán học.


bạn có thể giải thích một chút về cách bạn đến với giải pháp này nhanh như vậy không? Tôi nghĩ Math.ceil chỉ làm tròn số thập phân thành số nguyên.
Amit Erandole,

2
Chà, nó làm tròn đến toàn bộ số nguyên ở đây, @AmitErandole;)
Michael Krelin - hacker.

1
+1 cho nhỏ gọn và hiệu quả ... và nó sẽ làm tròn thành 10, phải không? :)
zx81

Tôi muốn thêm tham số khác để chức năng này, cho thấy sự "tròn", do đó số lượng ban đầu có thể được làm tròn đến bất cứ điều gì chúng ta thiết lập trong các cuộc gọi chức năng và không chỉ cố định 5 ...
TheCuBeMan

3
Tôi thích giải pháp này! Tôi đã triển khai nó bằng cách đóng cửa để thuận tiện thay đổi nhiều nội tuyến khi cần thiết: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mCách sử dụng:roundToNearestMultipleOf(5)(32)
gfullam 21/02 '19

12
const roundToNearest5 = x => Math.round(x/5)*5

Điều này sẽ làm tròn số đến gần nhất 5. Để luôn làm tròn đến 5 gần nhất, hãy sử dụng Math.ceil. Tương tự như vậy, để luôn làm tròn xuống, hãy sử dụng Math.floorthay vì Math.round. Sau đó, bạn có thể gọi hàm này giống như cách bạn làm khác. Ví dụ,

roundToNearest5(21)

sẽ trở lại:

20

Câu trả lời được chấp nhận thực sự là sai. Đây là cách chính xác. Cũng hoạt động với các số thập phân như 2,5
Oliver Dixon


5

Tôi đến đây trong khi tìm kiếm thứ gì đó tương tự. Nếu số của tôi là —0, —1, —2 thì số này phải bằng —0, và nếu là —3, —4, —5 thì sẽ dừng ở —5.

Tôi đã đưa ra giải pháp này:

function round(x) { return x%5<3 ? (x%5===0 ? x : Math.floor(x/5)*5) : Math.ceil(x/5)*5 }

Và các bài kiểm tra:

for (var x=40; x<51; x++) {
  console.log(x+"=>", x%5<3 ? (x%5===0 ? x : Math.floor(x/5)*5) : Math.ceil(x/5)*5)
}
// 40 => 40
// 41 => 40
// 42 => 40
// 43 => 45
// 44 => 45
// 45 => 45
// 46 => 45
// 47 => 45
// 48 => 50
// 49 => 50
// 50 => 50

1
Điều này có thể được thực hiện đơn giản hơn bằng cách sử dụngMath.round
Spencer Stolworthy,

2
voici 2 solutions possibles :
y= (x % 10==0) ? x : x-x%5 +5; //......... 15 => 20 ; 37 => 40 ;  41 => 45 ; 20 => 20 ; 

z= (x % 5==0) ? x : x-x%5 +5;  //......... 15 => 15 ; 37 => 40 ;  41 => 45 ; 20 => 20 ;

Kính trọng Paul


0

// vòng với độ chính xác

var round = function (value, precision) {
    return Math.round(value * Math.pow(10, precision)) / Math.pow(10, precision);
};

// làm tròn đến 5 với độ chính xác

var round5 = (value, precision) => {
    return round(value * 2, precision) / 2;
}

0
const fn = _num =>{
    return Math.round(_num)+ (5 -(Math.round(_num)%5))
}

lý do sử dụng vòng là đầu vào dự kiến ​​có thể là một số ngẫu nhiên.

Cảm ơn!!!


-2
if( x % 5 == 0 ) {
    return int( Math.floor( x / 5 ) ) * 5;
} else {
    return ( int( Math.floor( x / 5 ) ) * 5 ) + 5;
}

có lẽ?


ReferenceError: intkhông được xác định. Có thể bạn muốn parseInt, nhưng điều này không cần thiết vì Math.floortrả về một số.
pawel 23/09/13
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.