Arredondamento - Dúvidas Gerais - Portugal-a-Programar
Por ruiribeiro, 13 de Novembro de 2013 em Dúvidas Gerais
Qual é o resultado do arredondamento de 0.465 a 2 casas decimais ???
Publicado 13 de Novembro de 2013 (editado)
Provavelmente depende do arredondamento que pretendes.
Se for ao mais proximo será 0,47
0-4 arredonda para baixo
5-9 arredonda para cima
Mas acho que algumas linguagens arredondam por default de forma diferente
Parece que em C# arredonda para 0.46
0-5 arredonda para baixo
6-9 arredonda para cima
Editado 13 de Novembro de 2013 por nelsonr
americob 278
As regras de arredondamento fiscais, legais, contabilísticas, etc. estão há muito definidas. É sempre para o cêntimo mais próximo, salvo indicação em contrário:
até 0,46499999(9) = 0,46
a partir de 0,465 = 0,47
Podes ver, por exemplo, aqui:
http://info.portaldasfinancas.gov.pt/NR/rdonlyres/C7CD5661-2826-43F0-8687-099FE41FDA31/0/circular_1_de_21-01-1999_gabinete_do_director-geral.pdf
Caso em que existe indicação em contrário é o arredondamento da retenção de IRS no Recibo de Salário (Categoria A), em que o DL 42/91 diz expressamente que o arredondamento é feita por excesso à unidade do euro.
Editado 13 de Novembro de 2013 por americob
Não confundir arredondamento com aproximação.
Arredondamento tem a regra que americob resumiu.
Aproximação, por ser feita por excesso ou por defeito.
Já agora, qual é a razão da pergunta? Qual é o contexto?
porque descobri hoje que nao sei arredondar... ver bankers rule no google..
curioso... o excel devolve 0.46 na funcao round de vba e 0.47 na formula... vb e c# devolve 0.46... php javascript, tsql, oracle, devolvem 0.47...
Provavelmente porque 0.465 em representação binária de números de vírgula flutuante (IEEE 754) não é possível de representar sem erro (0.465 pode estar a ser representado como 0.464999999 ou 0.465000001 internamente), daí que o arredondamento depois dependa da implementação . O arredondamento efectuado dependerá do formato em que o número foi guardado, binário ou decimal.
Já agora, IEEE 754 usa bankers' rounding - arredonda X.5 para o número par mais próximo. Isto é relativamente fácil de justificar com o argumento de que um número par força menos arredondamentos no futuro, reduzindo portanto o erro final.
Editado 13 de Novembro de 2013 por Warrior
Para isso mesmo servem as especificações de cada linguagem. Não podemos fazer traduções às letra... Round... arredondamento...
Por exemplo em VB uso Formatnumber que arredonda correctamente (4,55 -> 4,6)em vez de Round, que faz 4,55 ficar 4,5.
Já o CrystalReport tem o round a fazer arredondamento correcto.
Editado 13 de Novembro de 2013 por Rui Carlos
Na escola o normal é aprendermos a arredondar o 5 para cima, mas tenho ideia que na área da informática (e não só), a regra de arredondar para o par é habitual. Aliás, sempre tinha assumido que era essa a forma usada por "todos" os sistemas/linguagens (o que acabei de verificar que não é verdade). E pessoalmente também acho que este sistema é o mais "justo".
car4321, o Round em .Net também arredonda para par. O problema do 4.55 está relacionado com o facto, que o Warrior já referiu, de por vezes teres que arredondar na conversão para binário (0.55 é uma dizima infinita em binário).
Estes arredondamentos dão resultados interessantes Por exemplo:
double value = 11;
for(int i = 0; i < 5; i++) value += 0.1;
Console.WriteLine("{0} -> {1}", value, Math.Round(value));  // imprime: 11.5 -> 11
Console.WriteLine("{0} -> {1}", 11.5, Math.Round(11.5));  // imprime: 11.5 -> 12
O que pode dar uma ideia errada sobre a forma de arredondar usada.
(De referir que o 0.5 tem representação exacta em double, mas o 0.1 não tem, o que faz que aquele primeiro 11.5 não seja exactamente 11.5.)
tenho lidos normas (nacionais e internacionais)
ainda não percebi é se existe um método considerado cientificamente correcto..
em alguns sitios li que o bankers' rounding é o mais correcto... mas não estou convencido...
Publicado 18 de Novembro de 2013 (editado)
Há vários modelos de arredondamento. Eu aprendi um em Matemática e outro em Física ou Química, no meu tempo do secundário. Em FQ havia umas normas muito interessantes, quase pior que a numenclatura IUPAC.
Editado 18 de Novembro de 2013 por thoga31
O método cientificamente correcto é arredondar mas possuir uma estimativa do erro devido ao arredondamento.
Isto não é de todo trivial e na maior parte das situações é desnecessário, mas em muitas outras quando se lida com números de vírgula flutuante é necessário termos uma noção do erro de arredondamento; algumas considerações básicas:
- O valor esperado do erro da soma/subtração de duas variáveis com o mesmo erro não se altera (se considerares que o erro é "gaussiano", ou seja, que não é mais provável o teu erro ter sido por excesso do que por defeito ou vice-versa)
- O produto de uma variável com erro por uma constante K multiplica esse erro por K.
Saber qual a melhor forma de arredondar à priori é impossível porque depende das operações futuras. Divisões são a operação que mais frequentemente introduz erros de arredondamento; se souberes que no futuro vais fazer muitas divisões por 3 então o mais adequado é arredondar para múltiplos de 3 para não introduzir dízimas infinitas, etc.
marcolopes 390
Publicado 20 de Junho de 2014
Exacto. Isto é verdade para representações binárias... (ex: double, float...), por isso é sempre aconselhável que seja usado um "objecto" que consiga representações numéricas EXACTAS (ex: BigDecimal do Java).
Publicado 20 de Junho de 2014 (editado)
E porque não estás convencido? Há dúvidas? Repara que é uma questão de probabilidade! O que é mais correcto?
1,2,3,4 arredonda para BAIXO
5,6,7,8,9 arredonda para CIMA
ou (Banker's rounding)
6,7,8,9 arredonda para CIMA
5 arredonda para CIMA ou para BAIXO dependendo do dígito que estiver à esquerda da fracção descartada!
A mim parece-me muito mais justo o "Banker's rounding"
Editado 20 de Junho de 2014 por marcolopes
E por acaso não falta aí o 0?
0,1,2,3,4 arredonda para BAIXO
Diria que no caso do 0 não há arredondamento, pelo que é razoável não o considerar.
Em qualquer dos casos, se considerares a magnitude dos erros de arredondamento introduzidos também verás que as coisas não estão equilibradas (quando se arredonda o 5 sempre para cima).
Se for 0,4609999 ao arredondar para 0,46 não estás a arredondar o 0?
de 0 a 9 são dez algarismos 50% arredondam para CIMA outros 50% arredondam para BAIXO. não vejo onde está o desequilíbrio.
Neste caso não estás a arredondar o Zero! Estás a arredondar o dígito seguinte... que é 9. O Zero não necessita de arredondamento (seria simplesmente "truncado")
Se considerares os números inteiros entre 0 e 99999, e quiseres arredondar às centenas de milhar, tens o 0 que não precisa de arredondamento, e depois tens 49999 a serem arredondados para 0 (incluindo o 09999 e afins), e tens 50000 a serem arredondados para 100000.
Mas como disse anteriormente, o melhor é considerar os erros médios introduzidos pelos arredondamentos (visto que a contagem só faz sentido para valores discretos). Num arredondamento para 1, por exemplo, se por um lado 1.1234 vai introduzir um erro de -0.1234, por outro 1-0.234 introduz um erro de igual magnitude no sentido inverso. Isto é válido para todos os valores, excepto para o 0.5.
Caso tenhas números negativos, consegues resolver este desequilíbrio arredondando o 5 sempre para o valor mais próximo de 0 ou sempre na direcção oposta, o que dependendo do contexto pode tornar os arredondamentos justos.
Agora a arredondar sempre para cima, a tendência será para haver alguma distorção dos valores originais (mas também pode não haver nenhum problemas prático com isso).