2009-10-12 3 views
19

voglio convertire tutti i numeri con un'approssimazione di 0,25rotonda al più vicino .25 javascript

Quindi ...

5 becomes 5.00 
2.25 becomes 2.25 
4 becomes 4.00 
3.5 becomes 3.50 

Grazie

+14

Nessun tentativo da parte vostra? – random

+4

Questa domanda non sembra avere alcun senso. Tutti i tuoi numeri stanno diventando se stessi, non viene fatto alcun arrotondamento. – Barmar

risposta

71

Ecco un'implementazione di quello che rslite detto:

var number = 5.12345; 
number = (Math.round(number * 4)/4).toFixed(2); 
+1

Funziona anche in Java - grazie. – Fedearne

+3

@Fedearne: Questo è piuttosto un problema aritmetico rispetto a un problema linguistico. – Gumbo

+1

Qui è come una funzione: var roundNearQtr = funzione (numero) { return (Math.round (numero * 4)/4).toFixed (2); }; – spesic

56

Moltiplicare per 4, rotonda a intero, dividere per 4 e formato con due decimali.

Modifica Qualsiasi motivo per i downvotes? Almeno lascia un commento per sapere cosa dovrebbe essere migliorato.

+2

Perché è stato downvoted? È la risposta giusta, dopo tutto. – Duroth

+0

Grazie! Stavo chiedendo la stessa cosa ... – rslite

+0

+1: è giusto anche per me. – Steve

9

Se la velocità è la vostra preoccupazione, si noti che è possibile ottenere un miglioramento della velocità del 30% utilizzando:

var nearest = 4; 
var rounded = number + nearest/2 - (number+nearest/2) % nearest; 

Dal mio sito web: http://phrogz.net/round-to-nearest-via-modulus-division
Test di prestazioni qui: http://jsperf.com/round-to-nearest

+0

Ottima risposta ... Passa a questo se hai numeri negativi. var arrotondato = numero + più vicino/2 - Math.abs ((numero + più vicino/2)% più vicino); – Lenny

+0

@Lenny Ma nota che quando lo fai, stai invocando una chiamata di funzione ('Math.abs') e quindi perderai il vantaggio di velocità. – Phrogz

0

Un'ottima approssimazione per ro INANZIAMENTO:

function Rounding (number, precision){ 

    var newNumber; 
    var sNumber = number.toString(); 

    var increase = precision + sNumber.length - sNumber.indexOf('.') + 1; 

    if (number < 0) 
    newNumber = (number - 5 * Math.pow(10,-increase)); 
    else 
    newNumber = (number + 5 * Math.pow(10,-increase)); 

    var multiple = Math.pow(10,precision); 
    return Math.round(newNumber * multiple)/multiple; 
} 
+0

Com'è meglio delle altre risposte? Gli altri sembrano molto più brevi. (Potrei analizzare il codice per cercare di capire quale vantaggio ha, ma è più veloce chiedere.^_ ^) – Venryx

1

Ecco @ risposta di Gumbo in una forma di una funzione:

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

È ora possibile effettuare chiamate:

roundNearQtr(5.12345); // 5.00 
roundNearQtr(3.23); // 3.25 
roundNearQtr(3.13); // 3.25 
roundNearQtr(3.1247); // 3.00 
8

Ecco una funzione generica di fare l'arrotondamento. Negli esempi precedenti, è stato utilizzato 4 perché è nell'inverso di 0,25. Questa funzione consente all'utente di ignorare quel dettaglio. Al momento non supporta la precisione preimpostata, ma può essere facilmente aggiunta.

function roundToNearest(numToRound, numToRoundTo) { 
    numToRoundTo = 1/(numToRoundTo); 

    return Math.round(numToRound * numToRoundTo)/numToRoundTo; 
} 
+1

Ciò richiede un'operazione extra di 'Math.round (num/multiple) * multiple;'. * Tuttavia *, è la mia versione preferita per un motivo principale: non fornisce risultati come "0.3000000000000004" per 'Round (.2 + .1, .1)'. – Venryx

0

Usa sotto la funzione, speriamo vi sia utile

function roundByQuarter(value) { 
    var inv = 1.0/0.25; 
    return Math.round(value * inv)/inv; 
} 

Chiamare la funzione come sotto, si tradurrà il valore quartiere più vicino, cioè esso non tornerà .32, .89, .56 ma sarà restituire solo decimali .25, .75, .50.

roundByQuarter(2.74) = 2.75 

roundByQuarter(2.34) = 2.25 

roundByQuarter(2.94) = 3.00 

roundByQuarter(2.24) = 2.25 
0
function roundToInc(num, inc) { 
    const diff = num % inc; 
    return diff>inc/2?(num-diff+inc):num-diff; 
} 

> roundToInc(233223.2342343, 0.01) 
233223.23 
> roundToInc(505, 5) 
505 
> roundToInc(507, 5) 
505 
> roundToInc(508, 5) 
510