2012-05-06 14 views

Odpowiedz

17

To daje wynik między 0 a n - 1 zarówno dla dodatnich i ujemnych wartości x:

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

Te rzeczy są nad moją głową, ale to działa. Dzięki! –

+1

Mój przyjaciel właśnie zwrócił uwagę, że krótsza wersja będzie (n + x)% n –

+8

@TomHalladay: To działa dla x> = -n, ale nadal daje wynik ujemny dla x <-n. –

3

Cóż, modular arithmetic jest wykonywana na equivalence classes liczb całkowitych, więc ani Excel, ani żaden RDBMS nie "wykonuje niewłaściwego" wykonywania % ". Jeśli chcesz się z pracownikiem pomiędzy 0 i 6, choć zawsze można zrobić

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

Jedynym problemem jest to, czy moja wartość jest równa 0, muszę wyniku 0 –

+0

czekaj, więc masz parę liczb całkowitych '' n' m' i takie, że 'm' przystaje do 0 mod 'n', ale' select m% n' zwraca coś innego niż zero? –

+1

@JackManey: Twoja odpowiedź w '(m% n) + n', daje' (0% n) + n = n', gdzie OP chce, żeby było równe '0'. To jest podzespół powodów, dla których odpowiedź MarkByers ma dodatkowe '% n'. – MatBailie

1

Odważ się być nudnym (i spóźnionym na przyjęcie).

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 
Powiązane problemy