Python Números (int e float)
Quase todo programa faz conta: quantos pães sobraram na padaria, quanto custa o pedido, qual a média da turma. Para isso, o Python tem dois tipos de número que você vai usar o tempo todo: o int, para os números inteiros (3, 0, -5, 1250000), e o float, para os números com casas decimais (0.75, 25.9, -3.5). Nesta aula você vai ver como escrever cada um, por que o Python usa ponto e não vírgula, como ele lida com números gigantes e por que 0.1 + 0.2 não dá exatamente 0.3.
- A diferença entre
int(inteiro) efloat(com casas decimais), e como o Python decide qual é qual. - Que o
intdo Python não tem limite de tamanho. - A escrever números grandes com sublinhado:
1_000_000. - Por que a casa decimal é separada por ponto, e o que acontece se você usar vírgula.
- Por que
0.1 + 0.2dá0.30000000000000004, e como lidar com isso. - A notação científica:
1.5e3e2e-3. - Os erros reais: zero à esquerda, número grande demais para mostrar,
floatque estoura.
Os programas desta aula rodaram no Python 3.14 da máquina da Ana (usuária ana, computador notebook, Ubuntu 26.04), na pasta pessoal dela. Todos podem ser repetidos no editor do guia, que roda Python de verdade no navegador.
A ideia: contar e medir
Pense na padaria do bairro. Algumas coisas ali a gente conta: 12 pães, 3 bolos, 40 clientes. Ninguém compra "dois pães e meio". Outras coisas a gente mede: 2,5 kg de farinha, 0,75 real por pão, 1,8 litro de leite. Essas quase sempre têm uma parte depois da vírgula.
O Python separa os números do mesmo jeito:
| Tipo | Nome em inglês | Serve para | Exemplos |
|---|---|---|---|
int | integer, "inteiro" | Contar: quantidades, idades, anos, posições | 12, 0, -5, 2026 |
float | floating point, "ponto flutuante" | Medir: preços, pesos, médias, temperaturas | 0.75, 25.9, -3.5, 2.0 |
O nome "ponto flutuante" vem do jeito como o computador guarda esses números por dentro: o ponto decimal pode "flutuar" para a esquerda ou para a direita, o que permite guardar tanto 0.000002 quanto 2500000.0. Você não precisa saber os detalhes; basta lembrar que float é o número com casas decimais.
E como o Python sabe qual é qual? Pela escrita: número sem ponto é int; número com ponto é float. Você não precisa avisar o tipo em lugar nenhum.
1. Números inteiros: int
Para ter um inteiro, escreva os algarismos, sem aspas e sem ponto. A Ana anota o estoque da padaria:
paes = 12 bolos = 3 print(paes) print(paes + bolos) print(type(paes))
- paes = 12
- Guarda o número 12 na variável
paes(veja a aula Variáveis). Sem aspas: é um número, e não o texto "12". - paes + bolos
- Uma conta: o Python soma os dois valores e entrega o resultado, 15.
- type(paes)
- "Tipo": pergunta ao Python o tipo do valor (aula Descobrindo o Tipo).
$ python3 estoque.py 12 15 <class 'int'>
O <class 'int'> confirma: 12 é um int. Inteiros também podem ser negativos (com o sinal de menos na frente, colado) ou zero:
temperatura = -5 saldo = 0 print(temperatura) print(saldo) print(type(temperatura))
$ python3 temperatura.py -5 0 <class 'int'>
O int do Python não tem limite
Em muitas linguagens, o inteiro tem um tamanho máximo, e passar dele dá resultado errado. No Python, não: o int cresce o quanto for preciso, enquanto houver memória no computador.
Conta a lenda que o inventor do xadrez pediu ao rei, como recompensa, 1 grão de arroz na primeira casa do tabuleiro, 2 na segunda, 4 na terceira, sempre dobrando, até a casa 64. Quanto arroz é isso? O ** é a potência ("elevado a"); ele tem explicação completa na aula Operadores Aritméticos.
# grãos de arroz na última casa do tabuleiro de xadrez ultima_casa = 2 ** 63 print(ultima_casa) total = 2 ** 64 - 1 print(total) print(type(total))
$ python3 xadrez.py 9223372036854775808 18446744073709551615 <class 'int'>
Mais de 18 quintilhões de grãos, calculados sem erro nenhum, e o resultado continua sendo um int comum. Dá para ir muito além: 2 ** 1000 é um número de 302 algarismos, e o Python calcula na hora. (Existe um limite só para mostrar números com milhares de algarismos; você vai vê-lo em Quando dá errado.)
2. Números grandes com sublinhado: 1_000_000
Quantos zeros tem 10000000? Você teve de contar, não teve? Na escrita do dia a dia, a gente separa os milhares com ponto: 10.000.000. No Python, o ponto já tem outro uso (a casa decimal), então a separação é feita com o sublinhado _:
vendas_do_ano = 1_250_000 meta = 2_000_000 print(vendas_do_ano) print(meta - vendas_do_ano)
$ python3 vendas.py 1250000 750000
Repare: o sublinhado serve só para você ler o código. Para o Python, 1_250_000 e 1250000 são exatamente o mesmo número, e o print mostra sem os sublinhados. As regras são poucas:
- O sublinhado fica entre algarismos:
1_000vale;_1000não é um número (é um nome de variável!) e1000_dá erro. - Um sublinhado por vez:
1__000, com dois seguidos, dá erro. - O costume é separar de três em três, como os milhares, mas o Python não confere isso.
Missão: a padaria tem 2500000 gramas de farinha no depósito. Reescreva o número com sublinhados, separando os milhares, para ficar fácil de ler. O valor mostrado tem de continuar o mesmo.
farinha_em_gramas = 2500000 print(farinha_em_gramas)
farinha_em_gramas = 2_500_000 print(farinha_em_gramas)
3. Números com casas decimais: float
Para ter um float, escreva o número com um ponto separando a parte inteira da parte decimal:
preco_pao = 0.75 preco_bolo = 25.90 print(preco_pao) print(preco_bolo) print(type(preco_bolo))
$ python3 precos.py 0.75 25.9 <class 'float'>
Duas coisas para reparar:
- Ponto, nunca vírgula. O Python foi criado com a escrita dos números em inglês, em que a casa decimal é separada por ponto:
25.90. A vírgula, no Python, tem outro significado (ela separa valores), e trocar um pelo outro dá um resultado bem estranho. Você vai ver em Quando dá errado. - O zero do fim some. Você escreveu
25.90, e o Python mostrou25.9. Para ele, os dois são o mesmo número, e ele sempre mostra a forma mais curta. Para mostrar um preço com duas casas (25.90), use as f-strings:f"{preco_bolo:.2f}".
Quando o resultado vira float
Basta um float na conta para o resultado ser float. E a divisão com / sempre dá float, mesmo quando a conta é exata:
print(10 / 2) print(3 + 0.5) print(2 * 1.5) print(4.0) print(type(10 / 2))
$ python3 mistura.py 5.0 3.5 3.0 4.0 <class 'float'>
- 10 / 2 → 5.0
- A divisão com uma barra sempre devolve
float, por isso aparece5.0, e não5. (Existe a divisão que devolve inteiro, a//, na aula Operadores Aritméticos.) - 3 + 0.5 → 3.5
- Inteiro com
float: o resultado éfloat. O Python "promove" o 3 para 3.0 antes de somar. - 2 * 1.5 → 3.0
- O resultado é redondo, mas continua
float: por isso o.0. - 4.0
- Um número redondo escrito com ponto é
float. O.0é o jeito de o Python mostrar "isto é umfloat, não umint".
4. O mistério do 0.1 + 0.2
Abra o modo interativo do Python (aula O Modo Interativo) e faça uma conta que uma criança faz de cabeça:
$ python3 Python 3.14.4 (main, Aug 20 2026, 10:41:58) [GCC 15.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 0.1 + 0.2 0.30000000000000004 >>> 0.1 + 0.2 == 0.3 False >>> 1.1 * 3 3.3000000000000003 >>> 0.5 + 0.25 0.75
Não é defeito do Python, nem do seu computador. O == pergunta "é igual?" (aula Comparações), e o Python respondeu False: para ele, 0.1 + 0.2 não é igual a 0.3. O motivo é o jeito como o computador guarda os float.
Por que isso acontece
Tente escrever um terço com casas decimais: 0,333333… Por mais "3" que você escreva, nunca fica exato; em algum momento você para e arredonda. O computador tem o mesmo problema, só que com outros números: ele guarda os float em binário (só com 0 e 1), e em binário o número 0.1 é uma dízima sem fim, como o um terço para nós. Ele guarda uma aproximação muito boa (cerca de 16 algarismos certos), mas não exata. Quando você soma duas aproximações, o errinho às vezes aparece lá no 17º algarismo.
Repare que 0.5 + 0.25 deu 0.75 exato: metades, quartos e oitavos são "redondos" em binário. Já décimos e centésimos, os números do dinheiro, quase nunca são.
Como lidar com isso
| Situação | O que fazer | Exemplo |
|---|---|---|
| Mostrar o resultado | Arredonde na hora de mostrar | round(0.1 + 0.2, 2) dá 0.3; ou f"{total:.2f}" |
Comparar dois float | Não use ==; veja se a diferença é pequenininha | math.isclose(0.1 + 0.2, 0.3) (aula O Módulo math) |
| Dinheiro de verdade (um caixa, um banco) | Guarde os valores em centavos, como int, ou use o módulo decimal | preco_em_centavos = 2590 |
>>> round(0.1 + 0.2, 2) 0.3
O round(numero, casas) ("arredondar") devolve o número arredondado para a quantidade de casas que você pedir. Ele tem um detalhe curioso com os números terminados em 5, que você vai ver na aula Conversão de Tipos.
Missão: o programa mostra 0.30000000000000004. Use o round para mostrar a soma arredondada para 2 casas, ou seja, só 0.3.
print(0.1 + 0.2)
print(round(0.1 + 0.2, 2))
5. Notação científica: 1.5e3
Na escola, você talvez tenha visto números escritos como 1,5 × 10³ (que é 1500). O Python tem um jeito curto de escrever isso: a letra e (de "expoente") quer dizer "vezes 10 elevado a".
>>> 1.5e3 1500.0 >>> 2e-3 0.002 >>> 1e6 1000000.0 >>> type(1e6) <class 'float'>
- 1.5e3
- 1,5 × 10³ = 1,5 × 1000 = 1500. O expoente positivo anda com a vírgula para a direita.
- 2e-3
- 2 × 10⁻³ = 2 ÷ 1000 = 0,002. O expoente negativo anda para a esquerda.
- 1e6
- 1 × 10⁶, um milhão. Atenção: o resultado é
1000000.0, umfloat. Escrito come, o número é semprefloat, mesmo que seja redondo.
Você mesmo raramente vai escrever assim, mas o Python escreve: quando um float fica muito pequeno ou muito grande, ele passa a mostrá-lo em notação científica.
>>> 0.1 ** 10 1.0000000000000006e-10 >>> 1e16 1e+16 >>> 2.5e-4 * 2 0.0005
1.0000000000000006e-10 quer dizer 0,0000000001 (com o errinho do fim, que você já conhece). 1e+16 é 1 seguido de 16 zeros: o + só deixa claro que o expoente é positivo. Se aparecer um e no meio de um resultado seu, não se assuste: é só um número muito grande ou muito pequeno.
O float tem limites, o int não
O int cresce à vontade; o float, não. Ele guarda só uns 16 algarismos certos e tem um tamanho máximo (perto de 1,8 × 10³⁰⁸). Veja a diferença com o mesmo número escrito dos dois jeitos:
>>> 9007199254740993 9007199254740993 >>> 9007199254740993.0 9007199254740992.0 >>> 1e308 * 10 inf
Como int, o número ficou exato. Como float, o último algarismo virou 2: não coube. E passando do máximo, o float vira inf (de infinity, "infinito"). Moral: para contar coisas, use sempre int.
6. Um terceiro tipo: complex (só para conhecer)
O Python tem ainda um tipo de número que você provavelmente nunca vai usar fora de Matemática e Engenharia: os números complexos, com uma parte "imaginária" marcada pela letra j.
>>> 3 + 2j (3+2j) >>> type(3 + 2j) <class 'complex'>
Fica só o registro de que ele existe: se um dia aparecer um j colado num número, é um complex. Neste guia, os números são int e float.
Formas diferentes de escrever o mesmo número
O mesmo valor pode ser escrito de vários jeitos. Às vezes o tipo muda junto:
>>> 1000000 1000000 >>> 1_000_000 1000000 >>> 10 ** 6 1000000 >>> 1e6 1000000.0 >>> .5 0.5 >>> 5. 5.0 >>> 5e-1 0.5 >>> 1 / 2 0.5
| Escrita | Tipo | Quando usar |
|---|---|---|
1000000 | int | Números pequenos (até uns 4 algarismos), em que não há o que confundir |
1_000_000 | int | Números grandes: o costume recomendado, fácil de ler |
10 ** 6 | int | Quando a potência é o que importa (um milhão = 10⁶) |
1e6 | float | Contas de ciência; evite para contar, porque vira float |
0.5 | float | Sempre: é a forma clara |
.5 e 5. | float | Funcionam, mas o ponto "solto" passa despercebido. Prefira 0.5 e 5.0 |
Quando dá errado
É o erro mais comum de quem escreve números no Brasil. A Ana anotou o preço do pão de queijo com vírgula:
preco = 4,50 print(preco) print(preco * 2) print(type(preco))
$ python3 virgula.py (4, 50) (4, 50, 4, 50) <class 'tuple'>
Nenhuma mensagem de erro, e mesmo assim tudo errado. Para o Python, a vírgula separa valores. Então 4,50 não é "quatro e cinquenta": são dois números, o 4 e o 50, guardados juntos num pacote chamado tupla (tuple, que tem aula própria: Tuplas). Os parênteses em (4, 50) mostram isso. E o * 2 não dobrou o preço: repetiu o pacote, (4, 50, 4, 50).
Como consertar: casa decimal com ponto: preco = 4.50. Se um número seu aparecer entre parênteses, desconfie de uma vírgula.
SyntaxError
O CEP de São Paulo começa com zero. A Ana tentou guardar o começo dele como número:
cep = 01310 print(cep)
$ python3 cep.py
File "/home/ana/cep.py", line 1
cep = 01310
^
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers
Linha por linha:
- File "/home/ana/cep.py", line 1
- O arquivo e a linha do problema: a linha 1.
- cep = 01310
- A linha, copiada do seu código.
- ^
- O "chapeuzinho" aponta para onde o Python se perdeu: o zero do começo.
- SyntaxError
- "Erro de sintaxe": o código não está escrito de um jeito que o Python entenda. O programa nem começou a rodar; por isso não aparece a palavra
Traceback. - leading zeros in decimal integer literals are not permitted
- "Zeros à esquerda em números inteiros decimais não são permitidos".
- use an 0o prefix for octal integers
- "Use o prefixo 0o para números octais". O octal é um jeito de escrever números na base 8, que você pode ignorar. A dica está ali porque, em versões antigas do Python, um zero na frente queria dizer "octal".
Como consertar: CEP, telefone, CPF e números de documento não são números de conta: ninguém soma dois CEPs. Guarde-os como texto, entre aspas, e o zero fica: cep = "01310-100" (aula Strings).
invalid decimal literal
$ python3 -q
>>> 1_000__000
File "<python-input-0>", line 1
1_000__000
^
SyntaxError: invalid decimal literal
"Número decimal inválido". O -q ("quieto") só abre o modo interativo sem a mensagem de boas-vindas. O <python-input-0> no lugar do nome do arquivo quer dizer que o código foi digitado no modo interativo (é a primeira linha da sessão; a contagem começa do zero). O chapeuzinho aponta o sublinhado que sobrou. Com 1000_, sublinhado no fim, a mensagem é a mesma. Como consertar: um sublinhado só, entre algarismos: 1_000_000.
int grande demais para mostrar: ValueError
O int não tem limite, mas transformar um int enorme em texto (que é o que o print faz) tem. É uma proteção: mostrar um número de milhões de algarismos poderia travar o programa.
numero = 10 ** 5000 print(numero)
$ python3 gigante.py
Traceback (most recent call last):
File "/home/ana/gigante.py", line 2, in <module>
print(numero)
~~~~~^^^^^^^^
ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
- Traceback (most recent call last)
- "Rastro (a chamada mais recente por último)": o programa começou a rodar e parou no meio por causa de um erro. Leia de baixo para cima.
- line 2, in <module>
- Linha 2, no corpo principal do programa (
<module>). - ~~~~~^^^^^^^^
- Os tils e chapeuzinhos marcam o pedaço da linha que falhou: a chamada
print(numero). Repare que a linha 1, a conta, passou sem problema. - ValueError: Exceeds the limit (4300 digits) for integer string conversion
- "Erro de valor: passa do limite (4300 algarismos) para converter um inteiro em texto".
10 ** 5000tem 5001 algarismos. - use sys.set_int_max_str_digits() to increase the limit
- "Use
sys.set_int_max_str_digits()para aumentar o limite": se você realmente precisa, dá para mudar.
Na prática, você só esbarra nisso de propósito. Fica o aviso: a conta funciona; o que tem limite é a hora de mostrar.
float grande demais: OverflowError
print(2 ** 10000 > 0) print(2.0 ** 10000)
$ python3 estouro.py
True
Traceback (most recent call last):
File "/home/ana/estouro.py", line 2, in <module>
print(2.0 ** 10000)
~~~~^^~~~~~~
OverflowError: (34, 'Numerical result out of range')
A linha 1 calcula 2 ** 10000 como int e confere que é maior que zero: True, sem problema. A linha 2 faz a mesma conta com 2.0, um float, e o resultado passa do máximo do float. OverflowError quer dizer "erro de transbordamento", e Numerical result out of range, "resultado numérico fora do intervalo" (o 34 é o código desse erro no sistema). Como consertar: para números inteiros enormes, use int.
Se você rodar este programa no editor do guia, o erro é o mesmo OverflowError, mas o que vem entre parênteses muda: (68, 'Result not representable'), "resultado não representável". O número e o texto vêm do sistema por baixo do Python, e no navegador esse sistema é outro.
Missão: a Ana quer o preço de 2 bolos de R$ 25,90, mas o programa mostra (25, 90, 25, 90). Conserte o preço para o Python fazer a conta certa.
preco_bolo = 25,90 quantidade = 2 total = preco_bolo * quantidade print(total)
preco_bolo = 25.90 quantidade = 2 total = preco_bolo * quantidade print(total)
Referência rápida
| Escrita | Tipo | O que é |
|---|---|---|
12, -5, 0 | int | Inteiro: sem ponto, sem aspas. Sem limite de tamanho |
1_250_000 | int | O sublinhado separa os milhares, só para facilitar a leitura |
0.75, 25.9, 4.0 | float | Com casas decimais: separadas por ponto |
1.5e3, 2e-3 | float | Notação científica: 1,5 × 10³ e 2 × 10⁻³ |
10 / 2 | float | A divisão com / sempre dá float: 5.0 |
3 + 0.5 | float | int com float dá float |
round(x, 2) | float | Arredonda x para 2 casas |
3 + 2j | complex | Número complexo (só para conhecer) |
| Sintoma | Causa provável |
|---|---|
O número aparece entre parênteses: (4, 50) | Vírgula no lugar do ponto: 4,50 virou uma tupla |
SyntaxError: leading zeros in decimal integer literals are not permitted | Número inteiro com zero na frente: se é CEP ou telefone, guarde como texto |
SyntaxError: invalid decimal literal | Sublinhado duplo, no começo ou no fim do número (ou uma letra colada nele) |
0.30000000000000004 | Não é erro: é a aproximação do float. Arredonde para mostrar |
ValueError: Exceeds the limit (4300 digits)… | Tentou mostrar um int com mais de 4300 algarismos |
OverflowError: (34, 'Numerical result out of range') | Uma conta com float passou do máximo; use int |
Exercícios
1. O tipo do número
Qual é o tipo (int ou float) de cada valor?
2. Um milhão e meio
Escreva o número um milhão e quinhentos mil como int, separando os milhares do jeito recomendado:
3. O que print(1.5e2) mostra?
4. A Ana escreveu peso = 2,5 e o print(peso) mostrou (2, 5). Por quê?
5. Por que 0.1 + 0.2 == 0.3 dá False?
6. Como guardar o telefone 086 99999-0000 num programa?
Missão final: a conta do café da manhã
Missão: cada pão custa R$ 0,75 e a Ana comprou 10. O programa está com o preço errado (vírgula) e ainda não faz a conta. Escreva o preço do jeito certo e mostre o total da compra: preco_pao vezes quantidade.
preco_pao = 0,75 quantidade = 10 print(preco_pao)
preco_pao = 0.75 quantidade = 10 print(preco_pao * quantidade)
Deu 7.5: R$ 7,50. O zero do fim sumiu, como você já viu; para mostrar 7.50, use as f-strings.
Resumo
inté o número inteiro (para contar);floaté o número com casas decimais (para medir). O Python decide pelo jeito de escrever: com ponto éfloat.- O
intdo Python não tem limite de tamanho:2 ** 64 - 1sai exato. - Números grandes ficam legíveis com sublinhado:
1_250_000. O Python ignora os sublinhados. - A casa decimal é separada por ponto. Com vírgula,
4,50vira um pacote de dois números, sem erro nenhum. - A divisão com
/sempre dáfloat, e misturarintcomfloatdáfloat. 0.1 + 0.2dá0.30000000000000004: ofloaté uma aproximação. Arredonde para mostrar; não comparefloatcom==; para dinheiro de verdade, use centavos emint.1.5e3é notação científica (1500.0), e é semprefloat.- CEP, telefone e documentos são texto, não número: o zero à esquerda dá
SyntaxError.