2012-05-06 26 views

Respuesta

17

Esto le dará un resultado entre 0 y N - 1 para los valores positivos y negativos de x:

((x % n) + n) % n 
+0

Esto está por encima de mi cabeza, pero eso funciona. ¡Gracias! –

+1

Mi amigo acaba de señalar que una versión más corta sería (n + x)% n –

+8

@TomHalladay: Eso funciona para x> = -n, pero aún dará un resultado negativo para x <-n. –

3

Bueno, modular arithmetic se hace en equivalence classes de números enteros, por lo que ni Excel ni ningún RDBMS está "haciendo % mal". Si desea que un representante entre 0 y 6, sin embargo, siempre se puede hacer

select (-3 % 7) + 7; 
+0

El único problema es, si mi valor es 0, necesito un resultado de 0 –

+0

Espere, por lo que tiene un par de enteros 'm' y 'n' tal que' m' es congruente con 0 mod 'n', pero' select m% n' devuelve algo distinto de cero? –

+1

@JackManey: Su respuesta en '(m% n) + n', esto da' (0% n) + n = n' donde el OP quiere que sea igual a '0'. Ese es un subconjunto de las razones por las que la respuesta de MarkByers tiene un '% n' adicional. – MatBailie

1

Atrévete a ser aburrido (y llegar tarde a la fiesta).

declare @Modulus as Int = 7 
declare @Samples as Table (Value Int) 

insert into @Samples (Value) values (-12), (-3), (0), (3), (13), (70) 

select Value, 
    case Sign(Value) 
    when 1 then Value % @Modulus 
    when -1 then Value % @Modulus + @Modulus 
    else 0 
    end as Modulus 
    from @Samples 
Cuestiones relacionadas