2016-08-20 46 views
-1

我的程序的一部分测试两个数是否相等。由于某些操作只能使用双打,而其他操作只能使用整数,所以我在比较整数和双精度。即使他们只有回合等于(即7.5=7),两个程序仍然返回。我只想让程序返回true,如果两个实际上都是等于。我试过这里列出的解决方案:How to test if a double is an integer 以确定我的双打是否是整数。
所有这些似乎工作 - 他们编译,但程序仍然返回7=7.5 我试着去另一个方向也 - 将我的整数转换为双打 - 相同的结果。我如何让我的计划承认差异?与最新的建议:java测试如果double是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); 
         } 
        } 
       } 
      } 
     } 
    } 

我插入85作为我的测试号码。
唯一的结果应该是(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

此外,请尝试使用双精度和整数来查看此问题:http://stackoverflow.com/q/9898512/5335355 – CShark

回答

0

我认为问题在于在将double值转换为截断小数部分的int值之后,您正在比较'int'和'double'值。 例如(7==7.5)false,但(7==(int)7.5)true因为(int)7.5 = 7。 所以如果你想在int和double之间进行严格比较,你可以直接比较它们而不需要强制转换。如果您想了解更多关于如何将double转换为int的方法,请参阅How does double to int cast work in Java

+0

我将double值:redAverage与redAverage的截断整数进行比较如果它们相等,那么redAverage应该是一个int。我还可以使用redAverage的发言功能进行比较。我也熬过了RedAverage的底线和天花板。我用这里列出的解决方案:http://stackoverflow.com/questions/9898512/how-to-test-if-a-double-is-an-integer –