3.6. Tipos e valores¶
Observe que qualquer valor inteiro como 2
também pode ser escrito como um real usando a notação 2.0
(ou seja, a existência do ponto decimal indica que se trata de um número real, mesmo que a parte fracionária seja zero). Assim, ao escrever seus programas, procure sempre escrever os números reais de forma explícita, incluindo o ‘.0’ para indicar que a grandeza que deseja representar se trata de um real e não um inteiro.
Ao calcular expressões aritméticas é comum utilizar valores de tipos diferentes. No trecho de código abaixo, a variável perimetro
é calculada multiplicando o inteiro 2
por números reais. Execute esse trecho passo-a-passo clicando em Next
para verificar o tipo do valor associado a essa variável, resultado da expressão “2 * pi * raio”.
Activity: CodeLens 3.6.1 (cl03_dois_pi_raio_exemplo)
Para manter consistência nos dados, é desejável gerar um resultado que tenha o mesmo tipo dos dados utilizados, como 2 * 4
deve resultar no valor 8
inteiro.
Mas existem excessões como a divisão, onde “5 / 2” resulta no float
2.5
.
Quando há mistura de tipos, o Python realiza os cálculos usando o tipo mais “poderoso”, ou seja, em expressões com inteiros e reais, o resultado será real (float
).
Como o Python considera valores, também não há problema em comparar valores de tipos diferentes. Assim, a expressão 5 == 5.0
resulta no valor booleano True
(do tipo bool
).
Evite comparar igualdade entre floats
Devido a representação finita de número reais como números em ponto flutuante, números reais em Python são, na verdade, aproximações.
Por exemplo, considere o número Pi4 que representa o valor da constante matemática Pi usando 4 casas decimais (3.1415
)
e o número Pi5 que representa o mesmo valor mas com 5 casas decimais (3.14159
).
Qual seria o valor da expressão Pi4 == Pi5?
Outro problema de usar aproximações ao realizar cálculos é o acumulo de erros.
Por exemplo execute o trecho a seguir, procurando pensar no resultado antes de clicar o Next
.
Activity: CodeLens 3.6.2 (problema_igualdade_entre_floats)
Se for realmente necessário comparar floats, use um intervalo de precisão epsilon, pequeno o sufiente para a sua aplicação, como no trecho de código abaixo.
Activity: CodeLens 3.6.3 (outr_problema_igualdade_entre_floats)