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)

Você já fez das atividades dessa página