2010-07-15 19 views
28

Hay, ¿cómo voy a redondear un número hasta el múltiplo de 3 más cercano?Número de ronda hasta el múltiplo más cercano de 3

es decir

25 would return 27 
1 would return 3 
0 would return 3 
6 would return 6 

gracias

+15

0 devolvería 3 ???? ¿Por qué? –

+0

posible duplicado de [JQuery: cómo redondear un número entero hacia arriba o hacia abajo al 10 más cercano] (http://stackoverflow.com/questions/1684202/jquery-how-to-round-an-integer-up-or-down -to-the-nearest-10) – outis

Respuesta

57
if(n > 0) 
     return Math.ceil(n/3.0) * 3; 
    else if(n < 0) 
     return Math.floor(n/3.0) * 3; 
    else 
     return 3; 
+0

No creo que esto funcione, solo devolvería el mismo número – RobertPitt

+1

¿Por qué es eso? Digamos que tenemos 7 y queremos 9, 7/3 = 2.33333, ceil (2.3333) = 3, 3 * 3 = 9. ¿Me estoy perdiendo de algo? – Cambium

+0

Cambium tiene razón, funciona, porque redondea el n/3 hasta el número entero más cercano antes de multiplicar por 3 nuevamente. – Jake

2

(n - mod n 3) +3

+1

El operador de mod de JavaScript es%, adicionalmente (* equivocadamente *) redondeará los números pares que ya son múltiplos de 3 .. –

+0

No estaba 100% seguro de lo que era, así que simplemente escribí el seudocódigo ... – PaulJWilliams

+0

Así es como quería publicarlo Creo que nunca volveré a responder una pregunta matemática. Un pequeño error y obtienes votos inmediatamente. Peor que en la escuela;) Pero bueno, al menos pude obtener la insignia de "presión de grupo" :) – 2ndkauboy

17

Aquí está!

Number.prototype.roundTo = function(num) { 
    var resto = this%num; 
    if (resto <= (num/2)) { 
     return this-resto; 
    } else { 
     return this+num-resto; 
    } 
} 

Ejemplos:

y = 236.32; 
x = y.roundTo(10); 

// results in x = 240 

y = 236.32; 
x = y.roundTo(5); 

// results in x = 235 
+1

' Number (1) .roundTo (3) 'devuelve 0. – OrangeDog

+0

@OrangeDog ¡esto es perfecto! En su ejemplo, 1.6 o más deberían dar como resultado 3. Un número más pequeño dará 0. –

+4

La pregunta dice específicamente (y da ejemplos) que todos los números deben redondearse hacia arriba. – OrangeDog

-1
if(x%3==0) 
    return x 
else 
    return ((x/3|0)+1)*3 
+0

No cumple con el requisito (enojado) cuando n == 0. – OrangeDog

+0

Esta es literalmente la única respuesta correcta a esta pregunta o_O – brandonscript

+2

O_o ​​what? 'x/3 | 0' es lo mismo que' Math.floor (x/3) 'excepto un 27% más lento, de acuerdo con [JSPerf] (https://jsperf.com/math-floor-vs-math-round- vs-parseint/74). Además, si 'x = -4', entonces genera 0, lo cual es claramente incorrecto, sin importar cómo se defina el redondeo. – riv

6

Esta función redondeará al múltiplo más próximo de lo que sea el factor que usted proporciona. No redondeará 0 o números que ya son múltiplos.

round_up = function(x,factor){ return x - (x%factor) + (x%factor>0 && factor);} 

round_up(25,3) 
27 
round up(1,3) 
3 
round_up(0,3) 
0 
round_up(6,3) 
6 

El comportamiento para 0 no es lo que pidió, pero parece más consistente y útil de esta manera. Y si lo desea redondear a 0, sin embargo, la siguiente función que haría:

round_up = function(x,factor){ return x - (x%factor) + ((x%factor>0 || x==0) && factor);} 

round_up(25,3) 
27 
round up(1,3) 
3 
round_up(0,3) 
3 
round_up(6,3) 
6 
8

Estoy respondiendo esto en psuedocode ya programo principalmente en SystemVerilog y Vera (ASIC HDL). % representa una función de módulo.

round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor) 

Esto funciona en cualquier caso.

El módulo del número calcula el resto, restando eso del divisor resulta en el número requerido para llegar al siguiente divisor múltiple, luego se produce la "magia". Se podría pensar que es lo suficientemente bueno para tener la función de módulo único, pero en el caso en que el número es un múltiplo exacto del divisor, se calcula un múltiplo adicional. es decir, 24 volvería 27. El módulo adicional protege contra esto haciendo la adición 0.

+1

'function roundUpMultiple (num, div) {return num + ((div- (num% div))% div)}' –

+1

Esto da como resultado la pérdida de importancia para un número que es menor que 0 pero mayor que -1, por lo que por ejemplo 'n = -. 1; d = 3; n + (dn% d)% d' devuelve' 8.326672684688674e-17'. Este método también se puede utilizar para redondear un número hacia abajo (en lugar de hacia arriba) a un múltiplo de 'd' haciendo' d' negativo, pero luego da como resultado la pérdida de importancia para un número que es mayor que 0 pero menor que 1 , de modo que 'd = -3; [- 3, -1, -. 1,0, .1,3] .map (función (x) {retorno x + (dx% d)% d})' devuelve '[ -3, -3, -3,0, -8.326672684688674e-17,3] '. – user4669748

12

Simplemente:

3.0*Math.round(n/3.0) 

?

+0

Además del requisito de la operación para n = 0, esto debería ser mayor. – KeatsPeeks

+0

Respuesta más simple y mejor que la aceptada. –

+0

para cumplir con el requisito loco, agregue 'if (n === 0) return 3': P – Mizstik

0

$(document).ready(function() { 
 
    var modulus = 3; 
 
    for (i=0; i < 21; i++) { 
 
     $("#results").append("<li>" + roundUp(i, modulus) + "</li>") 
 
    } 
 
}); 
 

 

 
function roundUp(number, modulus) { 
 
    var remainder = number % modulus; 
 
    if (remainder == 0) { 
 
     return number; 
 
    } else { 
 
     return number + modulus - remainder; 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
Round up to nearest multiple of 3: 
 
<ul id="results"> 
 
</ul>

+0

Esto da el resultado incorrecto para los números negativos. – user4669748

3

Como se mencionó en un comentario a la respuesta aceptada, sólo puede utilizar esto:

Math.ceil(x/3)*3 

(A pesar de que no vuelve 3 cuando x es 0, porque probablemente fue un error del OP.)

De las nueve respuestas publicadas antes de esta (que no se han eliminado o que no tienen un puntaje tan bajo que no son visibles para todos los usuarios), solo los de Dean Nicholson (excepto el problema con la pérdida de importancia) y beauburrier son correctos. La respuesta aceptada da el resultado incorrecto para los números negativos y agrega una excepción para 0 para explicar lo que probablemente fue un error por parte del OP.Otras dos respuestas redondean un número al múltiplo más cercano en lugar de redondear siempre, una más da el resultado incorrecto para los números negativos, y tres más dan el resultado incorrecto para los números positivos.

2

Basado en el enfoque de @ Makram, encontré que el ejemplo original de Math.prototype no redondeaba con precisión los números negativos. Aquí es una función ligeramente modificada que se ocupa de ambos números positivos y negativos en tanto la instancia y múltiples valores:

Number.prototype.mround = function(_mult) { 

    var base = Math.abs(this); 
    var mult = Math.abs(_mult); 
    var mod = (base % mult); 

    if (mod <= (mult/2)) { 
     base -= mod; 
    } else { 
     base += (mult - mod); 
    } 

    return (this<0)?-base:base ; 

} 

Ejemplos: (-2) .mround (3) devuelve -3;
(0) .mround (3) devuelve 0;
(2) .mround (3) devuelve 3;
(25.4) .mround (3) devuelve 24;

Cuestiones relacionadas