Como converter número float para string sem ele arredondar ou tornar notação científica?

128 views
Skip to first unread message

John

unread,
Feb 8, 2020, 2:36:26 PM2/8/20
to Python Brasil

Olá, pessoal


Estou enfrentando algumas limitações do python, e até já me conformei (um pouco frustrado, diga-se de passagem) que a função input não permite formatar os dados no momento de entrada, como limitar o número de casas decimais ou padronizar em um formato CPF. (se eu estiver enganado sobre isso, me corrijam, pfv)

Mas indo ao ponto, preciso converter números grandes (float para string), porém sem arredondar ou tornar em notação científica. A string resultante precisa ter exatamente os mesmos dígitos para que eu possa processar dígito por dígito. Porém, ao converter o número 4687687664615467616357.99 para string ele me retorna 4.6876876646154675e+21, o que frustra totalmente meu propósito. Já procurei solução para esse problema em várias páginas e fóruns, mas até agora ninguém soube apresentar uma solução que resolva.

Segue parte do código (alterado) para exemplificar.

Agradeço antecipadamente a quem apresentar uma solução.

Att.

john


valor = 4687687664615467616357.99
vsor_str_valor = str(valor)
print(vsor_str_valor+' foi convertido para string!')

Arthur Endlein Correia

unread,
Feb 8, 2020, 3:08:04 PM2/8/20
to python...@googlegroups.com
Olá John,

Não é possível representar o valor que você deu como exemplo como um double IEE 754 de 64 bits, ele necessariamente será arredondado.
Você poderia dar mais contexto sobre o que você está tentando fazer?
Se for possível obter ele em sua representação de string, você pode convertê-lo em um Decimal:
No qual você pode controlar o número de casas decimais necessárias para qualquer que seja o número que você precisa trabalhar.
Assim você pode fazer qualquer operação necessária nele, e por fim, convertê-lo em uma string sem perda de precisão.
 

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/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 ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/dfeefe53-ed81-451d-9a44-519ad09ad671%40googlegroups.com.

Demiraldo Santos

unread,
Feb 8, 2020, 3:30:55 PM2/8/20
to python...@googlegroups.com
Olá John:

O que o Arthur está dizendo está certo. Já passei por esse tipo de problema, mas foi em SQL.
Foi preciso pegar um valor em float, mas não deu certo converter diretamente pela função CONVERT do SQL Server. Foi preciso converter para Decimal e na mesma linha da conversão, já dar um REPLACE onde havia "." (ponto) para "," (vírgula).
Ainda estou estudando Python, porém, não tive uma necessidade igual a sua. Creio que o Arthur já deve ter passado por isso e ele deve ter feito o que respondeu pra você. Tenta buscar no Google algo como "Python conversão float string"



--
Um forte abraço,

Demiraldo Alaim Alves dos Santos

John

unread,
Feb 8, 2020, 4:03:29 PM2/8/20
to Python Brasil
Olá, Arthur

Estou tentando criar uma função para converter um valor numérico para o extenso, até 999 quintilhões. Sei que uma função como essa para um valor desse tamanho pode parecer estranho, mas isso é um desafio de exercício para mim. Já tenho boa parte do código feito, com alguns erros lógicos que estou resolvendo, mas ele só funciona bem para valores de 0 a 99999999999999.98, maior que isso ele arredonda. Quando estiver tudo funcionando bem, postarei o código aqui.
Obrigado a todos, mesmo assim.
Att.
John

Em sábado, 8 de fevereiro de 2020 17:08:04 UTC-3, Arthur Endlein Correia escreveu:
Olá John,

Não é possível representar o valor que você deu como exemplo como um double IEE 754 de 64 bits, ele necessariamente será arredondado.
Você poderia dar mais contexto sobre o que você está tentando fazer?
Se for possível obter ele em sua representação de string, você pode convertê-lo em um Decimal:
No qual você pode controlar o número de casas decimais necessárias para qualquer que seja o número que você precisa trabalhar.
Assim você pode fazer qualquer operação necessária nele, e por fim, convertê-lo em uma string sem perda de precisão.
 
On Sat, Feb 8, 2020 at 4:36 PM John <contato...@hotmail.com> wrote:

Olá, pessoal


Estou enfrentando algumas limitações do python, e até já me conformei (um pouco frustrado, diga-se de passagem) que a função input não permite formatar os dados no momento de entrada, como limitar o número de casas decimais ou padronizar em um formato CPF. (se eu estiver enganado sobre isso, me corrijam, pfv)

Mas indo ao ponto, preciso converter números grandes (float para string), porém sem arredondar ou tornar em notação científica. A string resultante precisa ter exatamente os mesmos dígitos para que eu possa processar dígito por dígito. Porém, ao converter o número 4687687664615467616357.99 para string ele me retorna 4.6876876646154675e+21, o que frustra totalmente meu propósito. Já procurei solução para esse problema em várias páginas e fóruns, mas até agora ninguém soube apresentar uma solução que resolva.

Segue parte do código (alterado) para exemplificar.

Agradeço antecipadamente a quem apresentar uma solução.

Att.

john


valor = 4687687664615467616357.99
vsor_str_valor = str(valor)
print(vsor_str_valor+' foi convertido para string!')

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/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...@googlegroups.com.

Pedro Werneck

unread,
Feb 8, 2020, 4:21:04 PM2/8/20
to python...@googlegroups.com
Você precisa converter para decimal no input, sem passar por float. No momento que converte para float, você perde informação e não recupera mais o valor original.


---
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 ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/168e33f0-693b-48be-b1f1-1a643f2143f3%40googlegroups.com.


--
---
Pedro Werneck

John

unread,
Feb 8, 2020, 11:41:18 PM2/8/20
to Python Brasil
Pô, valeu amigão, resolveu aqui. Não chegou a pegar o número grande que eu queria mas tá de bom tamanho.
Obrigado


--
---
Pedro Werneck

Gilberto Olimpio Jr.

unread,
Feb 12, 2020, 7:13:43 AM2/12/20
to python...@googlegroups.com
John

Talvez isso ajude:

from decimal import Decimal

valor = input()
vsor_str_valor = str(Decimal(valor))

abraços
--------------------------------------------------------
Gilberto Olímpio
Tel.: (34) 99165-2276
Uberlândia - MG


--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/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-brasi...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages