2012-05-06 14 views

risposta

17

Questo darà un risultato compreso tra 0 e n - 1 per entrambi i valori positivi e negativi di x:

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

Questa roba è sopra la mia testa, ma funziona. Grazie! –

+1

Il mio amico ha appena sottolineato che una versione più breve sarebbe (n + x)% n –

+8

@TomHalladay: Ciò funziona per x> = -n, ma darà comunque un risultato negativo per x <-n. –

3

Bene, modular arithmetic viene eseguito su equivalence classes di numeri interi, quindi né Excel né alcun RDBMS "sta facendo % sbagliato". Se si desidera un rappresentante tra 0 e 6, però, si può sempre fare

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

L'unico problema è, se il mio valore è 0, ho bisogno di un risultato di 0 –

+0

Attendere, quindi hai una coppia di interi 'M' e' n' tale che 'M' è congruente a 0 mod 'n', ma' selezionare m% n' restituisce qualcosa di diverso da zero? –

+1

@JackManey: la tua risposta in '(m% n) + n', questo dà' (0% n) + n = n' dove l'OP vuole che sia uguale a '0'. Questo è un sottoinsieme dei motivi per cui la risposta di MarkByers ha un '% n' aggiuntivo. – MatBailie

1

Abbi il coraggio di essere noioso (e in ritardo alla festa).

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 
Problemi correlati