Javascript: Sonraki 5'in katına yuvarlayın


115

En yakın 5 katı yerine sonraki 5'in katına yuvarlayan bir tamsayı değeri (uzunluğu 2 ila 5 basamak arasında değişen) alan bir yardımcı program işlevine ihtiyacım var. İşte elde ettiğim şey:

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

Ben çalıştırdığınızda round5(32), bana verir 30ben 35. istedikleri yere,
ben çalıştırdığınızda round5(37), bana verir 35ben 40 istediğiniz yere.

Ben çalıştırdığınızda round5(132), bana verir 130ben 135. istedikleri yere,
ben çalıştırdığınızda round5(137), bana verir 135ben 140 istediğiniz yere.

vb...

Bunu nasıl yaparım?


3
round5(5)5 mi vermeli 10 mu?
user2357112,

1
Peki ya: x'i 5'e bölmek, en yakın tam sayıya yuvarlamak (Math.ceil işlevini kullanarak) ve sonra 5 ile çarpmak?
Martin Wilson

2
round5 (5), 5
Amit Erandole

Yanıtlar:


275

Bu işi yapacak:

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

Bu sadece ortak yuvarlamanın numberen yakın xfonksiyon katına bir varyasyonudur Math.round(number/x)*x, ancak .ceilbunun yerine kullanmak .round, matematik kurallarına göre her zaman aşağı / yukarı yerine yuvarlama yapar.


Bu çözüme nasıl bu kadar çabuk geldiğinizi biraz açıklayabilir misiniz? Math.ceil'in yalnızca ondalık sayıları tam sayılara yuvarladığını sanıyordum.
Amit Erandole

2
Burada tam sayıya yuvarlanıyor, @AmitErandole;)
Michael Krelin - hacker

1
Kompakt ve verimli için +1 ... ve 10'a yuvarlayacak, değil mi? :)
zx81

Bu işleve "yuvarlayıcıyı" gösteren başka bir parametre
eklerdim

3
Bu çözümü seviyorum! Bunu gerektiği gibi çoklu satır içi uygun bir şekilde değiştirmek için bir kapatma ile uyguladım: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mKullanım:roundToNearestMultipleOf(5)(32)
gfullam

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

Bu, sayıyı en yakın 5'e yuvarlar. Her zaman en yakın 5'e yuvarlamak için kullanın Math.ceil. Aynı şekilde, her zaman aşağı yuvarlamak için Math.flooryerine kullanın Math.round. Daha sonra bu işlevi diğer herhangi bir işlev gibi çağırabilirsiniz. Örneğin,

roundToNearest5(21)

dönecek:

20

Kabul edilen cevap aslında yanlış. Bu doğru yoldur. Ayrıca 2.5 gibi ondalık sayılarla çalışır
Oliver Dixon


5

Buraya benzer bir şey ararken geldim. Numaram —0, —1, —2 ise —0'a kadar olmalı ve —3, —4, —5 ise —5'e düşmelidir.

Bu çözümü buldum:

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

Ve testler:

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
Bunu kullanarak daha basit bir şekilde gerçekleştirilebilirMath.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 ;

Sevgiler Paul


0

// hassas bir şekilde yuvarlayın

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

// hassas bir şekilde 5'e yuvarlayın

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

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

round kullanmanın nedeni, beklenen girdinin rastgele bir sayı olabilmesidir.

Teşekkürler!!!


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

olabilir?


ReferenceError: inttanımlı değil. Belki istedin parseInt, ama Math.floorbir sayı döndürdüğü için bu gerekli olmayacak .
pawel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.