Liczba zaokrągleń Javascript do najbliższej 0,5


99


Czy ktoś może mi podpowiedzieć, jak zaokrąglić liczbę do najbliższej 0,5.
Muszę skalować elementy na stronie internetowej zgodnie z rozdzielczością ekranu i do tego mogę przypisać rozmiar czcionki w punktach tylko do 1, 1,5 lub 2 i dalej itd.

Jeśli zaokrąglę, zaokrągla do 1 miejsca po przecinku lub do żadnego. Jak mogę wykonać tę pracę?

Odpowiedzi:


194

Napisz własną funkcję, która mnoży przez 2, zaokrągla, a następnie dzieli przez 2, np

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

Po prostu użyłem tego do wyczyszczenia funkcji redukcji wartości pieniężnych, które wracały z 9 miejscami dziesiętnymi ... (num * 100) / 100 działało idealnie.
Dustin Kreidler,

Jeśli chcesz otrzymać 13,0 lub 13,5, połączyłem twoją odpowiedź z poniższą: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D

zaokrąglanie liczby * 2 nie działa we wszystkich przypadkach ... spróbuj dowolnego miejsca dziesiętnego, takiego jak 15.27 => użycie formuły da => 15, gdzie w rzeczywistości powinno było zwrócić 15,5. **** Myślę, że użycie toFixed będzie lepsze (num * 2) .toFixed () / 2
bomba sfdx

@sfdxbomb Czy sprawdziłeś to? W konsoli mojej przeglądarki roundHalf(15.27)zwraca 15,5
malarres

82

Oto bardziej ogólne rozwiązanie, które może być przydatne:

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
Co to invznaczy? Co reprezentuje ta invzmienna?
Deilan

1
@Deilan inverse.
Alex K

3

Aby rozszerzyć górną odpowiedź o newtron, aby zaokrąglić więcej niż tylko 0,5

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)zwraca 0 , ale zgodnie z regułami matematycznymi powinno wynosić -1 .

Więcej informacji: Math.round () i Number.prototype.toFixed ()

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

1
@Yuri Aby rozwinąć to, co mówisz, roundzaokrągla do następnej liczby całkowitej większej niż podana wartość, która w ujęciu liczb ujemnych byłaby w kierunku dodatniego spektrum liczb całkowitych. -2,5 pójdzie do -2. Czy to jest poprawne?
Danny Bullis

Tak właśnie zweryfikowano. Math.ceil(-1.75) == -1i Math.floor(-1.75) == -2. Więc jeśli ktoś się przez to potknie, pomyśl o tym jako o ceilzwracaniu większej niż liczba, floorzwracaniu mniejszej niż liczba.
Danny Bullis

2

Tylko okrojona wersja wszystkich powyższych odpowiedzi:

Math.round(valueToRound / 0.5) * 0.5;

Rodzajowy:

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
    }

Napisałem to, zanim zobaczyłem lepszą odpowiedź Tunakiego;)


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

3
jeśli f = 1,9, da to v = 1, co jest niepoprawne.
bogatyrjov
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.