programandoai

Contas em Python: /, //, % e **

Somar e multiplicar todo mundo sabe. O que costuma surpreender é a divisão: o Python tem duas, um resto e uma potência, e os negativos têm um comportamento que vale conhecer.

Estudar esta lição interativa →

Uma loja de ovos tem 29 ovos e vende caixas de 12. Quantas caixas cheias saem? Quantos ovos sobram? Perguntas assim aparecem o tempo todo (parcelas, páginas, grupos, horas e minutos) e pedem operadores que a lição anterior não mostrou. Além de +, - e *, o Python tem quatro operadores que merecem atenção:

Divisão

/

A divisão "de verdade": sempre devolve um float, mesmo quando a conta é exata (4 / 2 vale 2.0).

Divisão inteira

//

Devolve só a parte inteira do quociente: quantas vezes o divisor cabe por completo.

Resto

%

O que sobra da divisão inteira. Também decide se um número é par (n % 2 == 0).

Potência

**

Eleva um número a outro: 2 ** 10 vale 1024. Não confunda com ^, que em Python é outra coisa.

ovos = 29
por_caixa = 12

print(ovos / por_caixa)   # 2.4166666666666665 (divisão "de verdade": sempre dá float)
print(ovos // por_caixa)  # 2 (divisão inteira: quantas caixas CHEIAS)
print(ovos % por_caixa)   # 5 (resto: quantos ovos sobram)
print(2 ** 10)            # 1024 (potência: 2 elevado a 10)
print(4 / 2)              # 2.0 (repare: continua sendo float)

29 ovos em caixas de 12: // diz as caixas cheias e % diz os ovos que sobram.

Pense no troco de uma compra: se você paga com uma nota de 50 uma conta de 29, // e % funcionam como contar quantas notas de 12 cabem em 29 e quanto fica na mão. O / seria dividir o dinheiro em fatias de qualquer tamanho, inclusive picadinhas decimais.

Com números negativos, o Python tem uma regra própria que pega muita gente: a divisão inteira arredonda sempre para baixo (rumo ao menor inteiro), e não para zero. Por isso -7 // 2 vale -4, e não -3, e o resto -7 % 2 vale 1, acompanhando o sinal do divisor. A função divmod(a, b) devolve o quociente e o resto de uma vez:

print(7 // 2)         # 3
print(-7 // 2)        # -4 (arredonda para BAIXO, e não para zero)
print(-7 % 2)         # 1 (o resto acompanha o sinal do divisor)
print(int(-7 / 2))    # -3 (int() corta as casas decimais: outra conta!)
print(divmod(29, 12)) # (2, 5) (quociente e resto de uma vez)
0.1 + 0.2 não é 0.3

Computadores guardam números decimais em binário, e muitos decimais simples (como 0.1) não cabem exatamente nesse formato. O resultado são diferenças minúsculas, como 0.30000000000000004 ou 26.700000000000003. Em dinheiro isso incomoda: o jeito de esconder o ruído na tela é formatar na hora de mostrar, com :.2f numa f-string. Para o programa que realmente soma e guarda valores, o mais seguro é trabalhar com centavos inteiros (890 em vez de 8.90) e só dividir por 100 ao exibir. (Mais adiante, o módulo decimal da biblioteca padrão resolve isso de outro jeito.)

print(0.1 + 0.2)              # 0.30000000000000004
preco = 8.9
print(preco * 3)              # 26.700000000000003
print(f"R$ {preco * 3:.2f}")  # R$ 26.70 (formatar na hora de MOSTRAR resolve a tela)

centavos = 890 * 3            # guardar centavos inteiros evita o erro na origem
print(f"R$ {centavos / 100:.2f}")  # R$ 26.70
Ordem das contas

O Python segue a ordem da matemática: ** primeiro, depois *, /, // e %, e por último + e -. 2 + 3 * 4 vale 14, e não 20; para mudar a ordem, use parênteses. Cuidado com o sinal: -2 ** 2 vale -4, porque a potência vem antes do sinal de menos.

alunos = 29
por_grupo = 4

grupos = 0  # sua vez: quantos grupos COMPLETOS? use //
sobram = 0  # sua vez: quantos alunos ficam sem grupo? use %

print(grupos, "grupos completos e sobram", sobram, "alunos")

Troque os dois zeros por // e % e rode.

← Voltar ao índice do curso