2016-08-20 4 views
-1

Une partie de mon programme teste si deux nombres sont égaux. Parce que certaines opérations ne prennent que des doubles et que d'autres ne prennent que des ints, je compare les ints et les doubles. Les programmes retournent que les deux sont égaux même lorsqu'ils ne sont que ronds pour être égaux (c'est-à-dire 7.5=7). Je veux seulement que le programme retourne vrai si les deux sont égaux. J'ai essayé les solutions énumérées ici: How to test if a double is an integer pour déterminer si mes doubles sont ints.
Tous semblent fonctionner - ils compilent, mais le programme revient toujours 7=7.5 J'ai aussi essayé d'aller dans l'autre direction - convertir mes ints en doubles - même résultat. Comment puis-je obtenir mon programme pour reconnaître la différence? Avec la suggestion la plus actuelle:java testing si double est un int

import acm.program.ConsoleProgram; 
import java.awt.Color; 
import acm.io.IODialog; 
import java.text.*; 
import static java.lang.Math.*; 
import java.util.*; 

/** Tests to see if user color matches sample colors */ 
public class ColorMatch extends ConsoleProgram 
{ 
//defining sample colors 
Color[] dmc = 
{ 
    new Color(255,255,255), 
    new Color(43,57,41), 
    new Color(213,39,86), 
    new Color(0,160,130), 
    new Color(0,0,0), 
}; 

public void run() 
{ 
    average(); 

} 

//averages three colors, then tests for match to given color 
public void average() 
{ 
    //asks for stitch color 
    IODialog dialog  = new IODialog(); 
    int stitchRed  = dialog.readInt("Enter red value: "); 
    int stitchGreen  = dialog.readInt("Enter green value: "); 
    int stitchBlue  = dialog.readInt("Enter blue value: "); 
    Color stitchColor = new Color(stitchRed,stitchGreen,stitchBlue); 

    //gets averages for dmc colors 
    for (Color i:dmc) 
    { 
     for (Color j:dmc) 
     { 
      for (Color k:dmc) 
      { 
       int indexI = Arrays.asList(dmc).indexOf(i); 
       int indexJ = Arrays.asList(dmc).indexOf(j); 
       int indexK = Arrays.asList(dmc).indexOf(k); 
       if (indexI <= indexJ && indexJ <= indexK) 
       { 
        int iRed = i.getRed(); 
        int jRed = j.getRed(); 
        int kRed = k.getRed(); 
        int iGreen = i.getGreen(); 
        int jGreen = j.getGreen(); 
        int kGreen = k.getGreen(); 
        int iBlue = i.getBlue(); 
        int jBlue = j.getBlue(); 
        int kBlue = k.getBlue(); 
        double redAverage = (iRed+jRed+kRed)/3; 
        double greenAverage = (iGreen+jGreen+kGreen)/3; 
        double blueAverage = (iBlue+jBlue+kBlue)/3; 
        if (redAverage == (int)redAverage && greenAverage == (int)greenAverage && blueAverage == (int)blueAverage) 
        { 
         int rAverage = (int)redAverage; 
         int gAverage = (int)greenAverage; 
         int bAverage = (int)blueAverage; 
         Color colorAverage = new Color(rAverage,gAverage,bAverage); 

         //tests to see if any average equals the stitch color 
         if (colorAverage.equals(stitchColor)) 
         { 
          println("The color match is: " + i + ", " + j + ", " + k); 
         } 
        } 
       } 
      } 
     } 
    } 

J'ai branché 85s comme mes numéros de test.
Le seul résultat devrait être (0,0,0)+(0,0,0)+(255,255,255), mais il donne aussi (43,57,41)+(213,39,86)+(0,160,130) . (41+86+130)/3=85.7!=85.

+1

Veuillez poster un [mcve]. –

+0

Aussi, essayez de regarder cette question pour votre problème avec les doubles et les ints: http://stackoverflow.com/q/9898512/5335355 – CShark

Répondre

0

Je pense que le problème est que vous faites une comparaison des valeurs 'int' et 'double' après avoir converti la valeur double en int qui tronque la partie décimale. Par exemple (7==7.5) est false, mais (7==(int)7.5) est vrai car (int)7.5 = 7. Donc si vous voulez une comparaison stricte entre un int et un double, vous pouvez les comparer directement sans lancer. Si vous voulez en savoir plus sur comment couler double à int fonctionne, s'il vous plaît se référer How does double to int cast work in Java.

+0

Je compare la valeur double: redAverage à l'entier tronqué de redAverage S'ils sont égaux, then redAverage devrait être un int. Je l'ai alternativement comparé en utilisant la fonction de plancher pour redAverage. J'ai aussi comared le plancher et le plafond de RedAverage. J'ai utilisé les solutions listées ici: http://stackoverflow.com/questions/9898512/how-to-test-if-a-double-i-an-integer –