【问题标题】:java testing if double is an intjava测试double是否为int
【发布时间】:2016-08-20 10:11:37
【问题描述】:

我的部分程序测试两个数字是否相等。因为某些操作只需要双精度数,而其他操作只需要整数,所以我比较的是整数和双精度数。程序返回两者相等,即使它们只是 round 相等(即7.5=7)。如果两者实际上 相等,我只希望程序返回 true。我已经尝试过这里列出的解决方案:How to test if a double is an integer 确定我的双打是否为整数。
它们似乎都可以工作 - 它们可以编译,但程序仍然返回 7=7.5 我也尝试过另一个方向——将我的整数转换为双精度数——结果相同。如何让我的程序承认差异?最新建议:

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

【问题讨论】:

标签: java int double equals-operator


【解决方案1】:

我认为问题在于,在将 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

【讨论】:

  • 我正在比较双精度值:redAverage 与 redAverage 的截断整数如果它们相等,那么 redAverage 应该是一个 int。我还使用 redAverage 的 floor 函数对其进行了比较。我还发现了 redAverage 的地板和天花板。我使用了这里列出的解决方案:stackoverflow.com/questions/9898512/…
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多