Como fazer a divisão de 2 ints produzir um float em vez de outro int?

149

Em outro exercício de Bruce Eckels, calcule a velocidade, v = s / tonde s e t são números inteiros. Como faço para que a divisão inicie uma bóia?

class CalcV {
  float v;
  float calcV(int s, int t) {
    v = s / t;
    return v;
  } //end calcV
}

public class PassObject {

  public static void main (String[] args ) {
    int distance;
    distance = 4;

    int t;
    t = 3;

    float outV;

    CalcV v = new CalcV();
    outV = v.calcV(distance, t);

    System.out.println("velocity : " + outV);
  } //end main
}//end class
phill
fonte
float v = s / t realiza a divisão e depois transforma o resultado em um float. float v = (float) s / t lança para flutuar e executa a divisão.
Juan Carlos Iturriagagoitia

Respostas:

307

Basta converter um dos dois operandos em um float primeiro.

v = (float)s / t;

O elenco tem maior precedência que a divisão, o que acontece antes da divisão.

O outro operando será efetivamente convertido automaticamente em um float pelo compilador porque as regras dizem que, se um operando for do tipo ponto flutuante, a operação será uma operação de ponto flutuante, mesmo que o outro operando seja integral. Especificação da linguagem Java, §4.2.4 e §15.17

Alnitak
fonte
8
Grrr, isso me levou cerca de 30 minutos até que eu encontrei isso e descobri. Tão simples. : D
Rihards
Mais especificamente, esta regra específica é mencionada aqui: Operadores Multiplicativos , portanto, deixe-a aqui para referência futura.
quantum
5
(Para quem se deparar com essa pergunta posteriormente, os links fornecidos estão quebrados. Os novos são: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 e docs. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Steve Haley
13

Experimentar:

v = (float)s / (float)t;

A moldagem das entradas em flutuadores permitirá que a divisão de ponto flutuante ocorra.

Você realmente só precisa lançar um, no entanto.

anisoptera
fonte
Não sei, é como dizer que você deve usar longs em vez de ints.
Jakub Zaverka
4

Converta um dos números inteiros em um ponto flutuante para forçar a operação a ser feita com a matemática de ponto flutuante. Caso contrário, a matemática inteira é sempre preferida. Assim:

v = (float)s / t;
Jason Coco
fonte
4

Para diminuir o impacto na legibilidade do código, sugiro:

v = 1d* s/t;
programador espacial
fonte
3

Você pode converter o numerador ou o denominador para flutuar ...

As operações int geralmente retornam int, então você precisa alterar um dos números de operação.

Jhonny D. Cano - Talheres-
fonte
1
Usualmente? Se eles retornarem, retornarão int.
Matthew Flaschen
3

Você pode converter apenas um deles, mas por consistência, pode querer converter explicitamente os dois, para que algo como v = (float) s / (float) t funcione.

Uri
fonte
1

Padrão JLS

JLS 7 15.17.2. Operador de divisão / diz:

A divisão inteira é arredondada para 0. Ou seja, o quociente produzido para os operandos ed que são números inteiros após a promoção numérica binária (§5.6.2) é um valor inteiro q cuja magnitude é a maior possível, satisfazendo | d · q | ≤ | n |. Além disso, q é positivo quando | n | ≥ | d | e n têm o mesmo sinal, mas q é negativo quando | n | ≥ | d | e n têm sinais opostos.

Isso é por que 1/2 que não dá uma bóia.

Converter apenas um deles para flutuar como em (float)1/2é suficiente porque 15.17. Operadores multiplicativos dizem:

A promoção numérica binária é realizada nos operandos

e 5.6.2. A promoção numérica binária diz:

  • Se um dos operandos for do tipo double, o outro será convertido em double.
  • Caso contrário, se um operando for do tipo float, o outro será convertido em float
Ciro Santilli adicionou uma nova foto
fonte
0

Lance um dos números inteiros / os dois inteiros para flutuar para forçar a operação a ser feita com ponto flutuante Math. Caso contrário, o número inteiro Math é sempre preferido. Assim:

1. v = (float)s / t;
2. v = (float)s / (float)t;
Nikhil Kumar
fonte
0

Tente o seguinte:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
Posso te ajudar
fonte