Numero di arrotondamento Javascript allo 0,5 più vicino


96


Qualcuno può darmi un'idea di come posso arrotondare un numero allo 0,5 più vicino.
Devo ridimensionare gli elementi in una pagina web in base alla risoluzione dello schermo e per questo posso solo assegnare la dimensione del carattere in punti a 1, 1.5 o 2 e oltre ecc.

Se arrotondo viene arrotondato a 1 cifra decimale o nessuno. Come posso svolgere questo lavoro?

Risposte:


187

Scrivi la tua funzione che moltiplica per 2, arrotonda e poi divide per 2, ad es

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

L'ho appena usato per ripulire una funzione di riduzione sui valori monetari che tornava con 9 punti decimali ... (num * 100) / 100 ha funzionato perfettamente.
Dustin Kreidler

Se vuoi finire con 13.0 o 13.5, ho combinato la tua risposta con quella qui sotto: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D

l'arrotondamento di num * 2 non funziona per tutti i casi .. prova un decimale come 15.27 => usando la tua formula darà => 15 dove in realtà dovrebbe essere restituito 15.5. **** Penso che l'uso di toFixed sarà migliore (num * 2) .toFixed () / 2
sfdx bomb

@sfdxbomb Hai controllato questo? Nella console del browser roundHalf(15.27)restituisce 15,5
malarres

81

Ecco una soluzione più generica che potrebbe esserti utile:

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
Cosa invsignifica? Cosa invrappresenta la variabile?
Deilan

1
@Deilan immagino inverse.
Alex K

2

Math.round(-0.5)restituisce 0 , ma dovrebbe essere -1 secondo le regole matematiche.

Altre informazioni: Math.round () e Number.prototype.toFixed ()

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

1
@Yuri Per espandere ciò che stai dicendo, roundarrotonda al numero intero successivo maggiore del valore dato, che in termini di numeri negativi sarebbe verso lo spettro intero positivo. -2,5 andrebbe a -2. È corretto?
Danny Bullis

Sì, appena verificato. Math.ceil(-1.75) == -1e Math.floor(-1.75) == -2. Quindi, per chiunque si lasci inciampare da questo, pensa solo che ceilrestituisce un numero maggiore di , floorrestituisce un numero minore di .
Danny Bullis

2

Per estendere la risposta in alto di newtron per l'arrotondamento su più di 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

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
    }

L'ho scritto prima di vedere la migliore risposta di Tunaki;)


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

3
se f = 1.9, questo risulterà in v = 1, che non è corretto.
bogatyrjov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.