在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),看看你得到了什么,看看你是否能解释原因