2010-01-19 18 views

Respuesta

99

simple:

if($number %6 != 0) { 
    $number += 6 - ($number % 6); 
} 

El operador modulus da el resto de la división, por lo que el número $ 6% es la cantidad que queda cuando se divide por 6. Esto será más rápido que hacer un bucle y continuamente revisando.

Si la disminución es aceptable, entonces este es incluso más rápido:

$number -= $number % 6; 
+0

Creo que esto también debería funcionar? 'if (6% $ number! = 0) {}' – thednp

+0

correcto pero necesita un espacio% 6 – Smith

1

Utilice la Mod% (módulo) del operador

if ($x % 6 == 0) return 1; 


function nearest_multiple_of_6($x) { 
    if ($x % 6 == 0) return $x;  

    return (($x/6) + 1) * 6; 
} 
5

Así que desea que el siguiente múltiplo de 6, es que?

Puede dividir su número de 6, entonces ceil ella, y se multiplica de nuevo:

$answer = ceil($foo/6) * 6; 
+0

Eso es un algoritmo profundo. – Karl

+5

¡Boo! ¿Por qué usar punto flotante cuando no es necesario? :) Tampoco es portable, porque la división int/int en muchos idiomas dará un resultado entero (truncado), por lo que ceil nunca verá la necesidad de redondearlo al siguiente valor entero, por lo tanto, la expresión dará el resultado incorrecto –

+1

En segundo lugar, usar coma flotante para lo que es esencialmente un problema de números enteros es horrible y puede no dar la respuesta correcta en todas las situaciones. – ZoFreX

1

sólo tiene que ejecutar un bucle while que continuará bucle (y aumentar el número) hasta que el número es divisible por 6.

while ($number % 6 != 0) { 
    $number++; 
} 
+4

se puede hacer sin bucles ... –

+0

El método ingenuo ahorra tiempo al programador, y mi jefe/El cliente siempre está al tanto de eso. – Karl

0

para los monstruos de micro-optimización:

if ($num % 6 != 0) 
    $num += 6 - $num % 6; 

Más evaluaciones de %, pero menos ramificaciones/bucles. :-P

6
$num += (6-$num%6)%6; 

sin necesidad de un bucle while! Módulo (%) devuelve el resto de una división. IE 20% 6 = 2. 6-2 = 4. 20 + 4 = 24. 24 es divisible por 6.

+0

¿Seguro de eso? : P – ZoFreX

+0

Creo que esto es incorrecto: está agregando el resto al número. Entonces, si el número fue 8, el resto es 2, agrega el resto 2 a 8, para obtener el resultado: 10. 10 no es divisible por 6 –

+0

Repare ese error literalmente 5 segundos después de publicar esto ... – Ponkadoodle

0

¿Por qué no utiliza el Modulus Operator?

Prueba esto:

while ($s % 6 != 0) $s++; 

O esto es lo que quería decir?

<? 

$s= <some_number>; 
$k= $s % 6; 

if($k !=0) $s=$s+6-$k; 
?> 
+0

Creo que esto es incorrecto: está agregando el resto al número. Entonces, si el número fue 8, el resto es 2, agrega el resto 2 a 8, para obtener el resultado: 10. 10 no es divisible por 6. –

+0

Sí, me había perdido algo. Corregido ahora. –

15
if ($variable % 6 == 0) { 
    echo 'This number is divisible by 6.'; 
}: 

Hacer divisible por 6:

$variable += (6 - ($variable % 6)) % 6; // faster than while for large divisors 
+0

El segundo operador% es muy inteligente. Probablemente más rápido que el mío :( – ZoFreX

-1
result = initial number + (6 - initial number % 6) 
+0

Esto no es del todo correcto. Reste el resto de 6 antes de agregarlo. – ZoFreX

1

Suponiendo $foo es un número entero:

$answer = (int) (floor(($foo + 5)/6) * 6) 
2

Veo algunas de las otras respuestas llamando al módulo dos veces.

Mi preferencia no es pedirle a php que haga lo mismo más de una vez. Por esta razón, guardo en caché el resto.

Otros desarrolladores pueden preferir no generar la variable global adicional o tener otras justificaciones para usar el operador de módulo dos veces.

Código: (Demo)

$factor = 6; 
for($x = 0; $x < 10; ++$x){ // battery of 10 tests 
    $number = rand(0 , 100); 
    echo "Number: $number Becomes: "; 
    if($remainder = $number % $factor) { // if not zero 
     $number += $factor - $remainder; // use cached $remainder instead of calculating again 
    } 
    echo "$number\n"; 
} 

Posible salida:

Number: 80 Becomes: 84 
Number: 57 Becomes: 60 
Number: 94 Becomes: 96 
Number: 48 Becomes: 48 
Number: 80 Becomes: 84 
Number: 36 Becomes: 36 
Number: 17 Becomes: 18 
Number: 41 Becomes: 42 
Number: 3 Becomes: 6 
Number: 64 Becomes: 66 
+1

¿Cuánto tiempo cree que se tarda en calcular el módulo? 1ns, tal vez 30 si estamos hablando de flotadores. crees que lleva almacenarlo en la memoria y luego cargarlo? 2ns si tienes suerte, cientos de ns si golpea una página de caché que ya está en uso y debe ser descargada a la RAM primero. Y eso ni siquiera cuenta para todo lo que PHP necesita hacer para administrar una variable. Un buen compilador usaría registros para ambos, pero estamos hablando de un lenguaje donde cada variable es un objeto. Y la asignación en condicionales es mala porque se ve como un error. Además, espacios en blanco por favor –

+0

Es un voto negativo bastante grosero, ¿no crees? Puedo agregar espacios en blanco si quieres, pero esta respuesta proporciona resultados correctos de una manera ligeramente diferente del resto. – mickmackusa

+1

y, por supuesto ... no ' te olvides el dif en el tiempo de los desarrolladores, mucho más importante que un par de ns gastados por la CPU. –

Cuestiones relacionadas