2016-08-20 3 views
-1

Teil meines Programms testet, wenn zwei Zahlen gleich sind. Da bestimmte Operationen nur Doppelgänger sind und andere nur Ints nehmen, vergleiche ich Ints und Doubles. Die Programme geben zurück, dass die beiden gleich sind, auch wenn sie nur um gleich sind (d. H. 7.5=7). Ich möchte nur, dass das Programm wahr zurückgibt, wenn die beiden gleich sind. Ich habe die hier aufgelisteten Lösungen ausprobiert: How to test if a double is an integer um festzustellen, ob meine Doubles ints sind.
Alle von ihnen scheinen zu arbeiten - sie kompilieren, aber das Programm gibt immer noch 7=7.5 Ich habe versucht, die andere Richtung auch zu gehen - Umwandlung meiner Eingänge in Doppel - das gleiche Ergebnis. Wie bekomme ich mein Programm, um den Unterschied zu erkennen? Mit dem aktuellsten Vorschlag:Java-Test, wenn Doppel ist ein 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); 
         } 
        } 
       } 
      } 
     } 
    } 

Ich steckte 85s als meine Testnummern ein.
Das einzige Ergebnis sollte (0,0,0)+(0,0,0)+(255,255,255) sein, aber es ergibt auch (43,57,41)+(213,39,86)+(0,160,130) . (41+86+130)/3=85.7!=85.

+1

Bitte posten Sie ein [mcve]. –

+0

Versuchen Sie auch, diese Frage für Ihr Problem mit Doppel und Ints zu sehen: http://Stackoverflow.com/q/9898512/5335355 – CShark

Antwort

0

Ich denke, das Problem besteht darin, dass Sie einen Vergleich der 'int' und 'Doppel' -Werte machen, nachdem Sie den Double-Wert in int umgewandelt haben, der den Dezimalteil abschneidet. Zum Beispiel ist (7==7.5)false, aber (7==(int)7.5) ist wahr weil (int)7.5 = 7. Also, wenn Sie strikte Vergleich zwischen einem Int und einem Doppel wollen, können Sie sie ohne Casting direkt vergleichen. Wenn Sie mehr darüber erfahren möchten, wie Double nach int funktioniert, lesen Sie bitte How does double to int cast work in Java.

+0

Ich vergleiche den doppelten Wert: redAverage mit der abgeschnittenen Zahl von redAverage Wenn sie gleich sind, dann sollte redAverage ein int sein. Ich habe es alternativ mit der floor-Funktion für redAverage verglichen. Ich habe auch den Boden und die Decke von redAverage gemerkt. Ich habe die hier aufgeführten Lösungen verwendet: http://stackoverflow.com/questions/9898512/how-to-test-if-a-double-is-aninteger –

Verwandte Themen