在java中,它的计算不正确

在java中,它的计算不正确,java,string,integer,Java,String,Integer,当我试图将我的作业从一个整数计算成一个字符串,然后正确地生成它时 基本上,我的家庭作业是在上课前做的,老师希望我们使用一个基本的扫描器,让用户输入,我宁愿在文本字段和文本区域中做 因此,对于我的程序,我有一个文本字段,询问用户总价格是多少,这是双倍的 我想把总数计算到一个有新行的文本区域 出于某种原因,我进行转换的方式,即取美元金额,并将其分解为他们需要的纸币和硬币的数量,但没有正确输出。下面有转换吗 public void actionPerformed(ActionEvent

当我试图将我的作业从一个整数计算成一个字符串,然后正确地生成它时

基本上,我的家庭作业是在上课前做的,老师希望我们使用一个基本的扫描器,让用户输入,我宁愿在文本字段和文本区域中做

因此,对于我的程序,我有一个文本字段,询问用户总价格是多少,这是双倍的

我想把总数计算到一个有新行的文本区域

出于某种原因,我进行转换的方式,即取美元金额,并将其分解为他们需要的纸币和硬币的数量,但没有正确输出。下面有转换吗

       public void actionPerformed(ActionEvent e) {

    // This class is being made to get the formula or what needs to be done

    // leaving this as tfAnswer even though its the value of dollar
    sDollarTotal = tfAnswer.getText();
    iDollarTotal = Double.valueOf(sDollarTotal);

    // Converting Distance to integer from string
    iTen = (int) (iDollarTotal / 10);
    sTen = String.valueOf(iTen);

    // calc the five bucks dude
    iFives = (int) ((iDollarTotal - iTen * 10) / 5);  //take the int  use the modules operator

    sFive = String.valueOf(iFives);

    // take the whole number and the whole number 

    iOne = (int) (((iDollarTotal - iTen * 10 - iFives * 5)));
    sOne = String.valueOf(iOne);

    iQuarter = (int) ((iDollarTotal - iTen * 10 - iFives * 5 - iOne) / 0.25);
    sQuarter = String.valueOf(iQuarter);

    iDime = (int) ((iDollarTotal - iTen * 10 - iFives * 5 - iOne - iQuarter * 0.25) / .10);
    sDime = String.valueOf(iDime);

    iNickel = (int) ((iDollarTotal - iTen * 10 - iFives * 5 - iOne
            - iQuarter * 0.25 - iDime * .10) / .05);
    sNickel = String.valueOf(iNickel);

    iPenny = (int) ((iDollarTotal - iTen * 10 - iFives * 5 - iOne
            - iQuarter * 0.25 - iDime * .10 - iNickel * .05) / .01);
    sPenny = String.valueOf(iPenny);

    textArea.setText(sTen + " Ten Dollar Bill" + "\n" + sFive
            + " Five Dollar Bills" + "\n" + sOne + " One dollar bill \n"
            + sQuarter + " Quarters \n" + sDime + " Dimes \n" + sNickel
            + " Nickels \n" + sPenny + " Pennys \n");

}
现在,当用户输入一个25.46美分的数字时,它会显示出来 2十 十五 0个 四分之一 两毛钱 0镍币 一便士

但当用户输入25.56时,它会显示

2十 十五 0个 0季度 0美分 1镍币 0便士

这显然是不对的。我试着使用modules操作符,但我无法找出正确使用它的公式,所以我用这种方式分解了它


有人能告诉我为什么我用25.56时它显示0便士。

我建议你在这里不要用double,因为它显然让你感到困惑

如果要使用double,则应始终对结果进行四舍五入,而不是四舍五入。此外,由于0.1、0.01和0.05无法准确表示,因此应避免使用它们

    int iPenny = (int) Math.round((iDollarTotal - iTen * 10 - iFives * 5 - iOne
            - iQuarter * 0.25 - iDime / 10.0 - iNickel / 20.0) * 100);
在这种情况下,打印正确的结果


不过,我还是建议你从

long cents = Math.round(Double.parseDouble(tfAnswer.getText()) * 100);

在此之后,您不需要使用任何浮点。

在调试器中单步执行代码时,您会看到什么?这就是我要做的。顺便说一句,我会使用局部变量,而不是这里的字段。您根本不需要调用String.valueOf()。您应该在iDollarTotal这样的变量中跟踪未更改的总数。这将在现在和将来节省大量的写作。或者。。。如果你不能使用调试器,除了学习如何使用它。。。在整个代码中转储变量,并查看特定点上的所有内容。所以在计算完iOne和Iqueter以及所有内容后,转储/显示/任何值,以便您可以看到它。把一些东西拆开。。。因此,如果
iPenny
的值是错误的,请分部分进行计算,这样您就可以看到它的哪一部分正在破坏您的值。每段计算后的输出。。。10美元说是从演员到INTS我还没有检查调试器,因为就像企鹅说的,我不100%确定怎么做。但是为什么双重身份会让我困惑呢?它不只是一个带小数点的数字吗?还是有更多的小数点呢?你说的字符串是对的。在我翻过书中的那一页之前,我把它转换成了文本字段,它说我也要做硬币,所以我把它改成了文本区域。如果你有bug,调试器应该是你首先使用的,不是这样。double是一个二进制浮点,也就是说,它不能准确地表示0.1、0.01或25.56这样的小数,如果您不知道如何处理表示错误,您将遇到类似这样的奇怪问题。谢谢,我将对double进行更多的研究。我不知道,直到现在我才明白。我想了一天;打印出新的BigDecimal(0.1),看看你得到了什么,看看你是否能解释原因