2016-08-20 8 views
-1

2つの数字が等しい場合、私のプログラムのテストが行​​われます。特定の操作は倍精度しかなく、他のものはintだけを取るので、intとdoubleを比較しています。プログラムは、の丸いが等しい(すなわち、7.5=7)場合でも、2つが等しいと返す。実際にと等しい場合にのみ、プログラムがtrueを返すようにします。私はここに記載されているソリューションを試しました:How to test if a double is an integer 私のダブルスがintかどうかを判断する。
これらはすべてコンパイルされているように見えますが、プログラムはまだ返されます7=7.5 私はintを倍精度に変換して同じ結果を得ました。どうすれば私のプログラムにその違いを認めることができますか?最新の提案で:doubleがintの場合のJavaテスト

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); 
         } 
        } 
       } 
      } 
     } 
    } 

私は私のテスト番号として85sを差し込んだ。
唯一の結果は(0,0,0)+(0,0,0)+(255,255,255)である必要がありますが、(43,57,41)+(213,39,86)+(0,160,130) . (41+86+130)/3=85.7!=85も得られます。

+1

[mcve]を投稿してください。 –

+0

また、doubleとintの問題については、この質問を見てみてください:http://stackoverflow.com/q/9898512/5335355 – CShark

答えて

0

私は、int型とdouble型の値を小数部を切り捨てるint型にキャストした後に比較しているというのが問題だと思います。 たとえば(7==7.5)ですが、(7==(int)7.5)です。(int)7.5 = 7です。 intとdoubleを厳密に比較したい場合は、キャストせずにそのまま比較することができます。あなたがintを動作させる方法について詳しく知りたければ、How does double to int cast work in Javaを参照してください。

+0

私はdouble値を比較しています:redAverageと切り捨てられた整数redAverageが等しい場合は、 redAverageはintでなければなりません。代わりに、redAverageのfloor関数を使用して比較しました。私もredAverageの床と天井を眺めてきました。私はここに記載されているソリューションを使用しました:http://stackoverflow.com/questions/9898512/how-to-test-if-a-double-is-an-integer –

関連する問題