2010-08-24 4 views
3

Je divise deux valeurs int, et je m'attends à en obtenir un double. mais cela fonctionne très étrange, il a les valeurs correctes juste avant la division mais il ne donne pas la bonne réponse.mauvaise division en Java

public void Analyse() { 
     for (FlowPacket fp : this.flow.GetAll()) { 
      if (fp.direction==1){ 
       this.sentPackets++; 
       this.sentLength = this.sentLength + fp.packetLength; 
      } 
      else{ 
       this.receivedPackets++; 
       this.receivedLength = this.receivedLength + fp.packetLength; 
      } 

     } 
     if(this.receivedPackets==0) 
       this.receivedPackets = 1; 
    } 


public double CalcRatio() { 
      return (this.sentPackets/this.receivedPackets); 
     } 

---------------------------- principale -------------- ------------------

System.out.print("Sent packets: " + analyser.getTotalSentPackets() + " , "); 
System.out.print("Received packets: " + analyser.getTotalReceivedPackets() + " , "); 
System.out.print("ratio: " + analyser.CalcRatio() + " , "); 

------------------------- --- outout ------------------------------

Sent packets: 2694 , Received packets: 5753 , ratio: 0 

Répondre

4
(double)this.sentPackets/this.receivedPackets 

... devrait le réparer.

2

Cast au moins l'un des ints de (double) avant de diviser.

4

Le résultat de la division est converti en une double division AFTER integer (avec arrondi vers le bas). Convertissez l'un des nombres entiers en un double AVANT de diviser afin que la double division se produise.

1

Nécessité de caster doubler ...

public double CalcRatio() { 
      return ((double) this.sentPackets/ (double) this.receivedPackets); 
     } 
2

Lorsque l'on divise un entier par un entier, la réponse sera un int. Par conséquent, il sera coupé tout reste il peut y avoir dans la réponse. Pour obtenir une double réponse, vous devez lancer l'un des jetons en double.

0

Ce comportement n'est pas spécifique à Java. Cela fonctionne de la même manière dans .NET, aussi.