Arredondando os números negativos em Java
Pergunta
De acordo com a Wikipedia quando arredondamento um número negativo, você arredondar o número absoluto. Então, por que o raciocínio, -3.5 seria arredondado para -4. Mas quando eu uso java.lang.Math.round (-3,5) retorna -3. Alguém pode explicar isso?
Solução
De acordo com a javadoc
Retorna o mais próximo longa ao argumento. O resultado é arredondado para uma número inteiro pela adição de 1/2, tendo a andar do resultado, e lançando o resultar digitar longa. Em outras palavras, o resultado é igual ao valor de a expressão:
(long)Math.floor(a + 0.5d)
Conceitualmente, você rodada se . Em outras palavras, para o número inteiro seguinte
Outras dicas
Há uma variedade de métodos de arredondamento; o que você está olhando é chamado Symmetrical arredondamento aritmético (como ele afirma). A seção que você está se referindo a estados: "Este método ocorre comumente usado em aplicações matemáticas, por exemplo em contabilidade É a única geralmente ensinado nas aulas de matemática elementar.". Este parece reconhecer que não é uma regra que é acordado globalmente em cima, apenas o que é mais comum.
Pessoalmente, eu não me lembro de nunca ter sido ensinado essa regra na escola. O meu entendimento de arredondamento tem sido sempre que 0,5 é arredondado para cima, independentemente do sinal do número. Aparentemente, os autores de Java têm o mesmo entendimento. Esta é assimétrica arredondamento aritmético.
Diferentes ferramentas e linguagens potencialmente utilizar diferentes esquemas de arredondamento. Excel, aparentemente, usa o método simétrico.
(No geral, eu recomendaria que se você encontrar um conflito entre Wikipedia e experiência, você procura por informações em outros lugares. Wikipedia não é perfeito.)
Por que vale a pena, java.math.BigDecimal
tem modos de arredondamento selecionáveis ??se precisar de mais controle sobre esse tipo de coisa.
O artigo da Wikipedia você cita não diz que é a única forma de rodada, apenas o caminho comum a rodada. Também mencionado nesse artigo várias alternativas (infelizmente, nenhum dos quais descrevem método de arredondamento de Java - mesmo que chamá-lo para fora como "Asymmetric arredondamento aritmético" ao indicar o JavaScript faz)
.Você precisa decidir como você deseja seus números arredondados, em seguida, usar esse método. Se a implementação do Java corresponde, então ótimo. caso contrário, você vai precisar para implementá-lo em seu próprio país.
De acordo com Javadocs:
Retorna o long
mais próximo ao argumento. O resultado é arredondado para um número inteiro, adicionando 1/2, tendo o piso do resultado, e conversão do resultado de tipo long
. Em outras palavras, o resultado é igual ao valor da expressão:
(long)Math.floor(a + 0.5d)
Acontece que a convenção é arredondar para cima. Eu acho que Wikipedia é falível. Acontece que a Microsoft enganou-se, porém, à medida que arredondar para -4 assim, que não é convenção (I verificado com alguém que tem um PhD em matemática).