Re: [python-brasil] Número de casas decimais consideradas em operações matemáticas

9,519 views
Skip to first unread message

Kaio Cesar

unread,
Jan 9, 2015, 7:04:58 AM1/9/15
to python...@googlegroups.com
Para notação você pode usar  valor = "%.2f" % (valor)  ou  valor = round(valor,2)

Fabio C. Barrionuevo da Luz

unread,
Jan 9, 2015, 7:18:06 AM1/9/15
to python...@googlegroups.com
Ola Paulo,
Apenas uma dica, visto que você irá trabalhar com números de ponto-flutuante. 

Use o modulo decimal[1][2] para trabalhar com números de ponto-flutuante, nos casos em que a precisão importa.

Isso evita problemas exotéricos, como descritos em [3][4].

O problema básico é:

Tente fazer no Python 2 ou 3, em Java ou C e outras linguagens, o calculo de:

1.1 + 2.2

Você espera que o resultado seja: 

3.3

Certo?
Não. Errado. O resultado é:

3.3000000000000003

Estranho né...
Isso é uma coisa normal e é o comportamento esperado!!??!, e ocorre devido a como o calculo é feito em binário e como isso é implementado nos processadores. 
O modulo decimal[1][2], faz a correção da precisão.

Da uma lida nos links abaixo, em especial o link[4]


Em 9 de janeiro de 2015 09:04, Kaio Cesar <tecnic...@gmail.com> escreveu:
Para notação você pode usar  valor = "%.2f" % (valor)  ou  valor = round(valor,2)

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Fábio C. Barrionuevo da Luz
Acadêmico de Sistemas de Informação na Faculdade Católica do Tocantins - FACTO
Palmas - Tocantins - Brasil - América do Sul


Blog colaborativo sobre Python e tecnologias Relacionadas, mantido totalmente no https://github.com/pythonclub/pythonclub.github.io .

Todos são livres para publicar. É só fazer fork, escrever sua postagem e mandar o pull-request. Leia mais sobre como publicar em README.md e contributing.md.
Regra básica de postagem:
"Você" acha interessante? É útil para "você"? Pode ser utilizado com Python ou é útil para quem usa Python? Está esperando o que? Publica logo, que estou louco para ler...

Ademir Francisco da Silva

unread,
Jan 9, 2015, 7:40:13 AM1/9/15
to python...@googlegroups.com
Uma opção ... {:.2f}.format( valor )

Ademir

On 09/01/2015 10:04, Kaio Cesar wrote:
> Para notação você pode usar valor = "%.2f" % (valor) ou valor =
> round(valor,2)
>
> --
> --
> ------------------------------------
> Grupo Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
>
> <*> Para visitar o site do grupo na web, acesse:
> http://groups.google.com/group/python-brasil
>
> <*> Para sair deste grupo, envie um e-mail para:
> python-brasi...@googlegroups.com
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo "Python
> Brasil" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele,
> envie um e-mail para python-brasi...@googlegroups.com
> <mailto:python-brasi...@googlegroups.com>.
> Para mais opções, acesse https://groups.google.com/d/optout.


--
Ademir Francisco da Silva
Skype ...: Ademir_Francisco_da_Silva
[ CMC ] God will do me justice

Juan Lopes

unread,
Jan 9, 2015, 1:29:47 PM1/9/15
to python...@googlegroups.com
Deixa eu entender, você quer uma forma de ativamente introduzir erros de precisão ao longo do cálculo porque o resultado que o Python está alcançando está... muito... correto?

Digo isso pois normalmente trunca-se o valor final apenas para fins de informação. Permitir que todas as contas sejam feitas em 3 casas decimais me parece simplesmente errado. Você considerou talvez que a implementação esteja incongruente com a referência e que de fato o arredondamento só precise ser feito no final?

2015-01-09 10:40 GMT-02:00 Ademir Francisco da Silva <ademir...@gmail.com>:
Uma opção ... {:.2f}.format( valor )

Ademir


On 09/01/2015 10:04, Kaio Cesar wrote:
Para notação você pode usar  valor = "%.2f" % (valor)  ou valor = round(valor,2)

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com <mailto:python-brasil+unsub...@googlegroups.com>.

Para mais opções, acesse https://groups.google.com/d/optout.


--
Ademir Francisco da Silva
Skype  ...: Ademir_Francisco_da_Silva
[ CMC ] God will do me justice
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
   http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
   python-brasil+unsubscribe@googlegroups.com

--- Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.



--

Joao S. O. Bueno

unread,
Jan 13, 2015, 12:24:10 PM1/13/15
to Python Brasil
Ok -

Então - na "vida real" - o melhor a fazer num caso desses é usar o
módulo "decimal" e
setar a precisão desejada lá - Decimal também é tecnicamente, ponto
flutuante, mas o número é
representado internamente em decimal, não em base 2 (ele é armazenado
em base 256, na verdade, mas isso é um detalhe técnico) - o fato é que
não se tem erros de arredondamento normalmente
decorrentes da conversão decimal <-> base 2 de ponto flutuante normal


Por outro lado, nesse caso específico, você tem de fato que usar só 3
casas decimais
- (dependendo de como isso estiver fraseado no seu livro, é caso de se
jogar o livro fora -
cuidado para não aprender conceitos errados de matemática - os
exemplos que você citou
no primeiro e-mail são estarrecedores: por que não é o caso de erro de
arredondamento
do float, mas sim, do livro descartar partes dos números da 4 casa
decimal em diante).

Bom, então - só para não passar em branco, já que ninguem respondeu ainda:
> Existe uma forma de OBRIGAR o programa arredondar todos resultados, tipo:

> Calcula A e arredonda, Calcula B e arredonda e então calcula B/A com os valores arredondados e arredonda o resultado...

> Como faço isso?

Com ponto flutante normal (tipo float), a própria função round do
Python aceita um segundo parâmetro com o número de casas decimais.

A = round(expressao, 3)
B = round(expressao2, 3)

C = round(A + B, 3)
etc...
Isso arredonda o valor na terceira casa decimal.
(Note que na maior parte das outras linguagens você teria que fazer
algo do tipo:

A = round((expressao) * 1000) / 1000.0

)


Em Python, no entanto, há o módulo decimal, que permite a
especificação de contexto
padrão com o número de dígitos desejado. SÒ QUE -- o número total de
dígitos, antes e depois da vírgula. Se você usar um contexto com 3
dígitos, terá "direito" h aum dígito antes do ponto decimal e dois
depois do ponto.

Portanto, para os exemplos que você colocou, as coisas funcionariam
para um contexto com 4 dígitos, mas dariam errado se você tiver mais
de um dígito antes do ponto decimal:

>>> import decimal
>>> decimal.setcontext(decimal.Context(prec=4))
>>> D = decimal.Decimal
>>> A = D("0.0013774104683200597")
>>> B = D("0.0030303030303035295")
>>> print A
0.0013774104683200597
>>> print B
0.0030303030303035295

>>> print (B/A)
2.200
>>> float(B/A)
2.2





2015-01-09 16:29 GMT-02:00 Juan Lopes <juanp...@gmail.com>:
> Deixa eu entender, você quer uma forma de ativamente introduzir erros de
> precisão ao longo do cálculo porque o resultado que o Python está alcançando
> está... muito... correto?
>
> Digo isso pois normalmente trunca-se o valor final apenas para fins de
> informação. Permitir que todas as contas sejam feitas em 3 casas decimais me
> parece simplesmente errado. Você considerou talvez que a implementação
> esteja incongruente com a referência e que de fato o arredondamento só
> precise ser feito no final?
>
> 2015-01-09 10:40 GMT-02:00 Ademir Francisco da Silva
> <ademir...@gmail.com>:
>
>> Uma opção ... {:.2f}.format( valor )
>>
>> Ademir
>>
>>
>> On 09/01/2015 10:04, Kaio Cesar wrote:
>>>
>>> Para notação você pode usar valor = "%.2f" % (valor) ou valor =
>>> round(valor,2)
>>>
>>> --
>>> --
>>> ------------------------------------
>>> Grupo Python-Brasil
>>> http://www.python.org.br/wiki/AntesDePerguntar
>>>
>>> <*> Para visitar o site do grupo na web, acesse:
>>> http://groups.google.com/group/python-brasil
>>>
>>> <*> Para sair deste grupo, envie um e-mail para:
>>> python-brasi...@googlegroups.com
>>>
>>> ---
>>> Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil"
>>> dos Grupos do Google.
>>> Para cancelar inscrição nesse grupo e parar de receber e-mails dele,
>>> envie um e-mail para python-brasi...@googlegroups.com
>>> <mailto:python-brasi...@googlegroups.com>.
>>> Para mais opções, acesse https://groups.google.com/d/optout.
>>
>>
>>
>> --
>> Ademir Francisco da Silva
>> Skype ...: Ademir_Francisco_da_Silva
>> [ CMC ] God will do me justice
>>
>> --
>> --
>> ------------------------------------
>> Grupo Python-Brasil
>> http://www.python.org.br/wiki/AntesDePerguntar
>>
>> <*> Para visitar o site do grupo na web, acesse:
>> http://groups.google.com/group/python-brasil
>>
>> <*> Para sair deste grupo, envie um e-mail para:
>> python-brasi...@googlegroups.com
>>
>> --- Você está recebendo esta mensagem porque se inscreveu no grupo "Python
>> Brasil" dos Grupos do Google.
>> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie
>> um e-mail para python-brasi...@googlegroups.com.
>> Para obter mais opções, acesse https://groups.google.com/d/optout.
>
>
>
>
> --
> https://github.com/juanplopes
>
> --
> --
> ------------------------------------
> Grupo Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
>
> <*> Para visitar o site do grupo na web, acesse:
> http://groups.google.com/group/python-brasil
>
> <*> Para sair deste grupo, envie um e-mail para:
> python-brasi...@googlegroups.com
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos
> Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie
> um e-mail para python-brasi...@googlegroups.com.
Message has been deleted
Message has been deleted

Linux - Junior Polegato

unread,
Oct 17, 2016, 8:26:14 AM10/17/16
to python...@googlegroups.com
Em 17-10-2016 09:39, Mateus Chuqui escreveu:
Juan Lopes, muitas casas decimais não significa resultado muiiiiito muitoo correto.
Deve-se utilizar o número de casas mais restrito que os dados possam ter.
Por exemplo:

 3,1 + 4,1269

Não podemos realizar a conta simplesmente somando 3,1 com 4,1269  pois temos uma incerteza nas ultimas casas do 3,1, sendo assim o resultado correto é 3.1 + 4,1 = 7.2

Se você colocar 7,2269 a Professora de Quimica vai dar errado!

"Assim, por exemplo, a divisão de  cm por  cm dá, ingenuamente, , adimensional, já que o cm do numerador é cancelado pelo cm do denominador. Como só podemos ter dois algarismos significativos, como em  cm, que é o numerador neste caso, devemos arredondar o quociente resultante para "

Olá!

        Existe o módulo "decimal", onde você especifica o número de dígitos significativos que deve resultar das operações, por exemplo com dois dígitos significativos:

»» import decimal
»» decimal.getcontext().prec = 2    # dígitos significativos
»» a = decimal.Decimal(3.1)
»» b = decimal.Decimal(4.1269)
»» a + b
Decimal('7.2')
»» a * b
Decimal('13')
»» a / b
Decimal('0.75')
»» b / a
Decimal('1.3')
»» a - b
Decimal('-1.0')
»» b - a
Decimal('1.0')


-- 

[]'s

Junior Polegato
Reply all
Reply to author
Forward
0 new messages