Javascript: Bulatkan ke kelipatan 5 berikutnya

113

Saya membutuhkan fungsi utilitas yang mengambil nilai integer (mulai dari 2 hingga 5 digit panjangnya) yang membulatkan ke kelipatan 5 berikutnya, bukan kelipatan terdekat 5. Inilah yang saya dapatkan:

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

Ketika saya berlari round5(32), itu memberi saya 30, di mana saya ingin 35.
Ketika saya berlari round5(37), itu memberi saya 35, di mana saya ingin 40.

Ketika saya berlari round5(132), itu memberi saya 130, di mana saya ingin 135.
Ketika saya berlari round5(137), itu memberi saya 135, di mana saya ingin 140.

dll ...

Bagaimana saya melakukan ini?

Amit Erandole
sumber
3
Haruskah round5(5)memberi 5, atau 10?
user2357112 mendukung Monica
1
Bagaimana jika: bagi x dengan 5, bulatkan ke atas ke bilangan bulat terdekat (menggunakan fungsi Math.ceil) lalu kalikan dengan 5?
Martin Wilson
2
round5 (5) harus memberikan 5
Amit Erandole

Jawaban:

271

Ini akan melakukan pekerjaan:

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

Ini hanya variasi dari pembulatan umum numberke beberapa xfungsi terdekat Math.round(number/x)*x, tetapi menggunakan .ceilalih-alih .roundmembuatnya selalu membulatkan ke atas, bukan ke bawah / ke atas menurut aturan matematika.

pawel
sumber
Bisakah Anda menjelaskan sedikit tentang bagaimana Anda sampai pada solusi ini begitu cepat? Saya pikir Math.ceil hanya membulatkan desimal menjadi bilangan bulat.
Amit Erandole
2
Ya, itu membulatkan ke seluruh bilangan bulat di sini, @AmitErandole;)
Michael Krelin - peretas
1
1 untuk kompak dan efisien ... dan itu akan menjadi 10, bukan? :)
zx81
Saya akan menambahkan parameter lain ke fungsi ini, menunjukkan "rounder", sehingga nomor asli dapat dibulatkan ke apa pun yang kami tetapkan dalam pemanggilan fungsi dan tidak hanya diperbaiki 5 ...
TheCuBeMan
3
Saya suka solusi ini! Saya menerapkannya dengan penutupan agar mudah mengubah beberapa inline sesuai kebutuhan: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mPenggunaan:roundToNearestMultipleOf(5)(32)
gfullam
12
const roundToNearest5 = x => Math.round(x/5)*5

Ini akan membulatkan angka ke 5 terdekat. Untuk selalu membulatkan ke atas ke 5 terdekat, gunakan Math.ceil. Demikian juga, untuk selalu membulatkan ke bawah, gunakan Math.floorsebagai pengganti Math.round. Anda kemudian dapat memanggil fungsi ini seperti yang Anda lakukan pada fungsi lainnya. Sebagai contoh,

roundToNearest5(21)

akan kembali:

20
Spencer Stolworthy
sumber
Jawaban yang diterima sebenarnya salah. Ini cara yang benar. Juga bekerja dengan desimal seperti 2.5
Oliver Dixon
5

Seperti ini?

function roundup5(x) { return (x%5)?x-x%5+5:x }
Michael Krelin - peretas
sumber
5

Saya tiba di sini sambil mencari sesuatu yang serupa. Jika nomor saya adalah —0, —1, —2 seharusnya lantai ke —0, dan jika —3, —4, —5 seharusnya menjadi —5.

Saya datang dengan solusi ini:

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

Dan tesnya:

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
AymKdn
sumber
1
Ini dapat dicapai lebih mudah dengan menggunakanMath.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 ;

Salam Paul

Paul Neulat
sumber
0

// bulat dengan presisi

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

// bulat ke 5 dengan tepat

var round5 = (value, precision) => {
    return round(value * 2, precision) / 2;
}
Dennis T
sumber
0
const fn = _num =>{
    return Math.round(_num)+ (5 -(Math.round(_num)%5))
}

Alasan menggunakan round adalah input yang diharapkan bisa berupa angka acak.

Terima kasih!!!

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

mungkin?

MyFantasy512
sumber
ReferenceError: inttidak ditentukan. Mungkin Anda ingin parseInt, tetapi ini tidak diperlukan karena Math.floormengembalikan angka.
pawel