Eu estava escrevendo este código:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
O resultado é 0. Por que isso acontece e como resolvo esse problema?
fonte
Eu estava escrevendo este código:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
O resultado é 0. Por que isso acontece e como resolvo esse problema?
Os dois operandos (1 e 3) são inteiros, portanto a aritmética de inteiros (divisão aqui) é usada. Declarar a variável de resultado como double apenas faz com que uma conversão implícita ocorra após a divisão .
A divisão inteira, é claro, retorna o verdadeiro resultado da divisão arredondado para zero. O resultado de 0.333...
é, portanto, arredondado para 0 aqui. (Observe que o processador não faz nenhum arredondamento, mas você ainda pode pensar nisso dessa forma.)
Além disso, observe que se ambos os operandos (números) são fornecidos como flutuantes; 3.0 e 1.0, ou mesmo apenas o primeiro , então a aritmética de ponto flutuante é usada, dando a você 0.333...
.
int i = .99999999
define int como 0. Mais especificamente, ele pega a parte inteira e descarta o resto.DOWN
é para zero. O arredondamentoFLOOR
é em direção ao infinito negativo.1/3
usa divisão inteira porque ambos os lados são inteiros.Você precisa que pelo menos um deles seja
float
oudouble
.Se você estiver inserindo os valores no código-fonte como sua pergunta, você pode fazer
1.0/3
; o1.0
é um duplo.Se você obtiver os valores de outro lugar, poderá usar
(double)
para transformar oint
em adouble
.fonte
Lance-o explicitamente como um
double
Isso acontece porque o Java usa a operação de divisão de inteiro para
1
e3
desde que você os inseriu como constantes inteiras.fonte
você deveria usar
ou
A divisão inteira retorna um inteiro.
fonte
Porque você está fazendo uma divisão inteira.
Como @Noldorin diz, se ambos os operadores forem inteiros, então a divisão de inteiros é usada.
O resultado 0,33333333 não pode ser representado como um número inteiro, portanto, apenas a parte inteira (0) é atribuída ao resultado.
Se qualquer um dos operadores for um
double
/float
, a aritmética de ponto flutuante ocorrerá. Mas você terá o mesmo problema se fizer isso:fonte
Porque trata 1 e 3 como inteiros, portanto, arredondando o resultado para 0, de modo que seja um inteiro.
Para obter o resultado que você está procurando, diga explicitamente a java que os números são duplos, como:
fonte
Faça o 1 um float e a divisão de float será usada
fonte
A conversão em JAVA é bastante simples, mas precisa de algum entendimento. Conforme explicado no JLS para operações inteiras :
E um exemplo é sempre a melhor forma de traduzir o JLS;)
Um pequeno exemplo usando Eclipse para mostrar que mesmo a adição de dois
short
s não será tão fácil:Isso exigirá uma fundição com uma possível perda de precisão.
O mesmo é verdadeiro para os operadores de ponto flutuante
Portanto, a promoção é feita no float para o dobro.
E a mistura de valores inteiros e flutuantes resulta em valores flutuantes, como disse
Isso é verdade para operadores binários, mas não para "Operadores de atribuição" como
+=
Um exemplo simples de trabalho é o suficiente para provar isso
A razão é que há um elenco implícito feito aqui, ele será executado como
fonte
1 e 3 são contantes inteiros e então Java faz uma divisão inteira cujo resultado é 0. Se você quiser escrever constantes duplas, você terá que escrever
1.0
e3.0
.fonte
A solução mais fácil é apenas fazer isso
O que isso faz, uma vez que você não inseriu 1.0 / 3.0, é permitir que você o converta manualmente para o tipo de dados double, já que Java assumiu que era uma divisão inteira, e faria isso mesmo que significasse estreitar a conversão. Isso é chamado de operador de elenco.
fonte
Eu fiz isso.
Use .0 ao fazer cálculos duplos ou então o Java assumirá que você está usando números inteiros. Se um cálculo usar qualquer quantidade de valores duplos, a saída será um valor duplo. Se forem todos inteiros, a saída será um inteiro.
fonte
(1/3) significa divisão inteira, por isso você não pode obter o valor decimal desta divisão. Para resolver este problema, use:
fonte
Como 1 e 3 são inteiros, o resultado não é arredondado, mas truncado. Assim, você ignora as frações e pega apenas todos.
Para evitar isso, tenha pelo menos um de seus números 1 ou 3 como formato decimal 1.0 e / ou 3.0.
fonte
Experimente isto:
fonte
Faça "duplo g = 1,0 / 3,0;" em vez de.
fonte
Muitos outros não conseguiram apontar o verdadeiro problema:
Isso necessariamente significa que os resultados de ponto flutuante, que podem ser exibidos como um inteiro, serão truncados (corte da parte decimal).
O que é casting (typecasting / conversão de tipo), você pergunta?
Isso varia de acordo com a implementação da linguagem, mas a Wikipedia tem uma visão bastante abrangente e também fala sobre coerção , que é uma informação essencial para responder à sua pergunta.
http://en.wikipedia.org/wiki/Type_conversion
fonte
1/2
, não na linguagem de destino (java). Você simplesmente invoca uma divisão inteira, que resultará em um resultado inteiro. A Fundição de Tipo é apenas por causa da conversão ascendente deint
para adouble
durante a atribuição.0.5
. Simplesmente, em Java,1/2
é uma divisão inteira, que resulta em um inteiro zero. Você pode atribuir um zero a um duplo, ainda será um zero, embora seja um0.0
duplo.