Autor Tópico: Bug - Arredondamento de Valores - "Resolvido"  (Lida 8115 vezes)

Régis Matos

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 632
  • Se a porta não se abrir, construa uma.
    • Email
Bug - Arredondamento de Valores - "Resolvido"
« Online: Outubro 20, 2011, 04:49:18 pm »
Olá a todos,

Favor, alguém mais pode fazer um teste e dizer se realmente é um bug, ou está acontecendo somente comigo aqui.

Campo do tipo Float (Decimal). Ao inserir um valor no formato:

11.111,11 >> 11.111,10
11.111,12 >> 11.111,10
11.111,13 >> 11.111,10
11.111,14 >> 11.111,10

Ele está aredondado o ultimo centavo, e acaba roubando 0,01 ou até 4 centavo(s).





« Última modificação: Novembro 06, 2011, 11:54:37 pm por Régis Matos »

wanderlanlima

  • Intermediário
  • ***
  • Mensagens: 241
    • Email
Re:Bug - Arredondamento de Valores
« Responder #1 Online: Outubro 21, 2011, 08:38:08 am »
Qual o banco ?

Arquimedes

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 561
  • Ajudar para ser ajudado
Re:Bug - Arredondamento de Valores
« Responder #2 Online: Outubro 21, 2011, 10:12:01 am »
Ola Regis,
  Fiz o teste no banco postgres utilizando um campo do tipo character varying e no sc do tipo decimal com 2 casas decimais e nao arredondou.
ficando assim no banco
sc                     banco
11.111,12 >11111.12

 Fiz o teste no banco mysql utilizando um campo do tipo float e no sc do tipo decimal com 2 casas decimais e nao arredondou.
sc                     banco
11.111,12 >11111.12


Atenciosamente Arquimedes

 
« Última modificação: Outubro 21, 2011, 10:35:12 am por Arquimedes »

Haroldo

  • Expert
  • *****
  • Mensagens: 6268
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re:Bug - Arredondamento de Valores
« Responder #3 Online: Outubro 21, 2011, 10:30:51 am »
Eu utilizo no banco Decimal(12,2) MySql, e não da esse problema.

wanderlanlima

  • Intermediário
  • ***
  • Mensagens: 241
    • Email
Re:Bug - Arredondamento de Valores
« Responder #4 Online: Outubro 21, 2011, 11:50:22 am »
No postgres sem problemas tb !

Régis Matos

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 632
  • Se a porta não se abrir, construa uma.
    • Email
Re:Bug - Arredondamento de Valores
« Responder #5 Online: Novembro 03, 2011, 10:08:58 pm »
Não sei mais o que fazer, o trem aqui arredonda...

Ninguém está com o mesmo problema ?

Vou gravar um vídeo mostrando pra vcs!

Preciso resolver isso, meu cliente está pegando no meu pé.

Régis Matos

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 632
  • Se a porta não se abrir, construa uma.
    • Email
Re:Bug - Arredondamento de Valores
« Responder #6 Online: Novembro 05, 2011, 11:41:31 am »

madxx

  • Iniciante
  • **
  • Mensagens: 81
    • Email
Re:Bug - Arredondamento de Valores
« Responder #7 Online: Novembro 05, 2011, 08:18:53 pm »
www.isub.com.br/test_script

coloquei a aplicação zipada neste link com o .sql - caso queira visualizar

mas se achar mais facil pode testar ai, em vez de "FLOAT" use "DOUBLE".

Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1640
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Re:Bug - Arredondamento de Valores
« Responder #8 Online: Novembro 06, 2011, 11:17:11 pm »
1) Para cálculos monetários no mysql considere o seguinte:

Decimal ou Numeric => precisão para cálculos matemáticos.
Float e Double => Trabalham com arredondamento e aproximação.

Campos tipo: FLOAT, REAL e DOUBLE PRECISION são campos com dados numéricos aproximados.
Enquanto campos tipo NUMERIC, DECIMAL, INTEGER, e SMALLINT são campos de de dados numéricos exatos.
Para valores monetários devem ser usados NUMERIC E DECIMAL para prever com exatidão os valores monetários.

Do manual do mysql (  http://dev.mysql.com/doc/refman/5.7/en/numeric-types.html ):

"MySQL suporta todos os tipos numéricos da ANSI/ISO SQL92. Estes tipos incluem o tipos de dados numéricos exatos (NUMERIC, DECIMAL, INTEGER, e SMALLINT), assim como o tipos de dados numéricos aproximados (FLOAT, REAL, e DOUBLE PRECISION). A palavra-chave INT é um sinônimo para INTEGER, e a palavra-chave DEC é um sinônimo para DECIMAL.

Os tipos NUMERIC e DECIMAL são implementados como o mesmo tipo pelo MySQL, como permitido pelo padrão SQL92. Eles são usados por valores para os quais é importante preservar a exatidão como, por exemplo, dados monetários. Quando é declarado um campo de algum desses tipos a precisão e a escala podem ser (e normalmente é) especificadas; por exemplo:

salario DECIMAL(5,2)"

No caso do tipo FLOAT a mesma parte do manual diz:

"O tipo FLOAT é usado para representar tipos de dados numéricos aproximados. O padrão SQL-92 permite uma especificação opcional da precisão (mas não da faixa do expoente) em bits, após a a palavra FLOAT e entre parenteses. A implementação MySQL também suporta esta especificação opcional de precisão. Quando FLOAT é usada para uma tipo de coluna sem especificação de precisão, MySQL utiliza quatro bytes para armazenar os valores. Uma sintaxe variante também é suportada, com dois numeros entre parenteses após a palavra FLOAT. Com esta opção, o primeiro número continua a representar a quantidade de bytes necessária para armazenar o valor, e o segundo número especifica o número de dígitos a serem armazenados e mostrados após o ponto decimal (como com DECIMAL e NUMERIC). Quando é pedido ao MySQL para armazenar um número em uma coluna com mais digitos decimais após o ponto decimal que o especificado para esta coluna, o valor é arredondado eliminando os digitos extras quando armazenado."

Uma coisa que não vi você fazer é determinar a precisão do seu campo tipo FLOAT.

Meu conselho é usar no lugar do campo FLOAT o DECIMAL ou NUMERIC com precisão 2 ou 4 conforme o caso.
Por exemplo, as bombas de gasolina trabalham com precisão 4.


2) Para cálculos monetários no PHP considere usar a biblioteca BCMATH ( BCMath Funções Matemáticas de Precisão Arbitrária ) .
No manual do php http://www.php.net/manual/pt_BR/book.bc.php
Não vou explicar porque usar a bcmath, mas deixo um link com a explicação:
http://bordim.net.br/programacao/php-e-o-ponto-flutuante/

Espero ter ajudado.
« Última modificação: Novembro 23, 2016, 09:25:17 pm por Alexandre Pereira Bühler »
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?

Régis Matos

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 632
  • Se a porta não se abrir, construa uma.
    • Email
Re:Bug - Arredondamento de Valores
« Responder #9 Online: Novembro 06, 2011, 11:54:04 pm »
buhlerax, Obrigado pelo esclarecimento...

Valeu a todos,

Realmente é a utilização do float, "Resolvido"

Mudei para Decimal(12,2)



jorgepopel

  • Expert
  • *****
  • Mensagens: 568
    • iCentro Tecnologia e Sistemas
    • Email
Re:Bug - Arredondamento de Valores - "Resolvido"
« Responder #10 Online: Maio 23, 2014, 12:59:18 pm »
Cada resposta do Alexandre é uma aula.

Um abraço, professor.
Cuidado com o frio de Ctba.


Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1640
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Re:Bug - Arredondamento de Valores - "Resolvido"
« Responder #11 Online: Maio 23, 2014, 02:22:57 pm »
Valeu.
Quando o frio chegar tomarei cuidado.
heheheeh
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?