Ir para o conteúdo
ruiribeiro

Arredondamento

Mensagens Recomendadas

ruiribeiro

Por curiosidade

Qual é o resultado do arredondamento de 0.465 a 2 casas decimais ???


Rui Ribeiro

.NET/T-SQL, JAVA, PHP, Javascript Developer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

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

-- EDIT --

Parece que em C# arredonda para 0.46

0-5 arredonda para baixo

6-9 arredonda para cima

Editado por nelsonr

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
americob

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 por americob

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
car4321

Por curiosidade

Qual é o resultado do arredondamento de 0.465 a 2 casas decimais ???

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruiribeiro

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...


Rui Ribeiro

.NET/T-SQL, JAVA, PHP, Javascript Developer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Warrior

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 por Warrior
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
car4321

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...

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 por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
car4321

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.)

:thumbsup:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruiribeiro

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...


Rui Ribeiro

.NET/T-SQL, JAVA, PHP, Javascript Developer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

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 por thoga31

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Warrior

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...

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.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes

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.

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).


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes

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...

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)

1,2,3,4 arredonda para BAIXO

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 por marcolopes

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
americob

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)

1,2,3,4 arredonda para BAIXO

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"

E por acaso não falta aí o 0?

0,1,2,3,4 arredonda para BAIXO

5,6,7,8,9 arredonda para CIMA

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

E por acaso não falta aí o 0?

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).

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
americob

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes

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")


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

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.

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).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.