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)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.70O 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.