En yakın 0,5'e Javascript yuvarlama numarası


100


Birisi bana bir sayıyı en yakın 0,5'e nasıl yuvarlayabilirim konusunda bir fikir verebilir mi?
Bir web sayfasındaki öğeleri ekran çözünürlüğüne göre ölçeklendirmem gerekiyor ve bunun için yazı tipi boyutunu sadece 1, 1.5 veya 2 ve sonrası gibi puntolara atayabilirim.

Yuvarlarsam, 1 ondalık basamağa yuvarlar veya hiçbiri. Bu işi nasıl başarabilirim?

Yanıtlar:


196

2 ile çarpan, yuvarlayan ve sonra 2'ye bölen kendi fonksiyonunuzu yazın, örneğin

function roundHalf(num) {
    return Math.round(num*2)/2;
}

Bunu sadece 9 ondalık nokta gibi geri gelen parasal değerlerde bir azaltma işlevini temizlemek için kullandım ... (num * 100) / 100 mükemmel çalıştı.
Dustin Kreidler

13.0 veya 13.5 ile sonuçlanmak istiyorsanız, cevabınızı aşağıdaki ile birleştirdim: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D

Num * 2'yi yuvarlamak her durumda işe yaramıyor ... 15.27 => gibi herhangi bir ondalık deneyin formülünüzü kullanarak => 15, gerçekte 15.5 döndürmesi gerekirdi. **** toFixed kullanmanın daha iyi olacağını düşünüyorum (num * 2) .toFixed () / 2
sfdx bomb

@sfdxbomb Bunu kontrol ettiniz mi? Tarayıcımın konsolunda roundHalf(15.27)15.5
malarres

85

İşte sizin için yararlı olabilecek daha genel bir çözüm:

function round(value, step) {
    step || (step = 1.0);
    var inv = 1.0 / step;
    return Math.round(value * inv) / inv;
}

round(2.74, 0.1) = 2.7

round(2.74, 0.25) = 2.75

round(2.74, 0.5) = 2.5

round(2.74, 1.0) = 3.0


1
Ne anlama invgeliyor? invDeğişken neyi temsil eder?
Deilan

1
@Deilan sanırım inverse.
Alex K

3

Yalnızca 0,5'ten fazla yuvarlamak için newtron'un en iyi cevabını genişletmek için

function roundByNum(num, rounder) {
    var multiplier = 1/(rounder||0.5);
    return Math.round(num*multiplier)/multiplier;
}

console.log(roundByNum(74.67)); //expected output 74.5
console.log(roundByNum(74.67, 0.25)); //expected output 74.75
console.log(roundByNum(74.67, 4)); //expected output 76


2

Math.round(-0.5)0 döndürür , ancak matematik kurallarına göre -1 olmalıdır .

Daha fazla bilgi: Math.round () ve Number.prototype.toFixed ()

function round(number) {
    var value = (number * 2).toFixed() / 2;
    return value;
}

1
@Yuri Söylediklerinizi genişletmek için round, verilen değerden daha büyük olan bir sonraki tam sayıya yuvarlar; bu, negatif sayılar açısından pozitif tam sayı spektrumuna doğru olacaktır. -2.5, -2'ye gider. Bu doğru mu?
Danny Bullis

Evet şimdi doğrulandı. Math.ceil(-1.75) == -1ve Math.floor(-1.75) == -2. Yani herkes için bundan takıldı alma, sadece olarak düşünmek ceilgetiri bir Büyüktür numarası, floorbir döner daha az sayıda.
Danny Bullis

2

Yukarıdaki tüm cevapların basitleştirilmiş bir versiyonu:

Math.round(valueToRound / 0.5) * 0.5;

Genel:

Math.round(valueToRound / step) * step;

1
    function roundToTheHalfDollar(inputValue){
      var percentile = Math.round((Math.round(inputValue*Math.pow(10,2))/Math.pow(10,2)-parseFloat(Math.trunc(inputValue)))*100)
      var outputValue = (0.5 * (percentile >= 25 ? 1 : 0)) + (0.5 * (percentile >= 75 ? 1 : 0))
      return Math.trunc(inputValue) + outputValue
    }

Bunu Tunaki'nin daha iyi yanıtını görmeden önce yazdım;)


0
var f = 2.6;
var v = Math.floor(f) + ( Math.round( (f - Math.floor(f)) ) ? 0.5 : 0.0 );

3
f = 1.9 ise, bu yanlış olan v = 1 ile sonuçlanacaktır.
bogatyrjov
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.