我正在尝试编写一个程序,以美元,四分之一,硬币等方式输出付款的变化。我在程序开头声明了所有的硬币变量,但是没有初始化它们,我得到了我尝试在程序中稍后初始化它时出现此错误。所以,我只是将它们初始化为0来初始化它们然后它不会识别我正在更改值并且它们保持为0。
import java.util.Scanner;
public class ChangeClient {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int dollars = 0;
int quarters = 0;
int dimes = 0;
int nickles = 0;
int pennies = 0;
double change = 0.0;
double newChange = 0.0;
System.out.println("How much was it? ");
double cost = kb.nextDouble();
System.out.println("What did you pay with? ");
double payment = kb.nextDouble();
if(payment-cost == 0) {
change = 0.0;
}
else {
change = payment - cost; //4.73
newChange = change;
if((newChange-change != 0 && newChange >= 1)) {
dollars = (int)(change/1);//dollars = 4
newChange = (change - dollars);// newchange = .73
}
if((newChange - change) != 0 && newChange >= .25) {
quarters = (int)(newChange/.25); //quarters = 2
newChange = (change - (dollars + (quarters*.25))); //newchange = 4.73 - (4+ (2*.25)) = .23
}
if(newChange - change != 0 && newChange >= .10){
dimes = (int)(newChange/.10); //dimes = 2
newChange = (change -(dollars + (quarters * .25) + (dimes * .10))); //newchange = 4.73 - (4+ (2*.25) + (2*.10)) = .03
}
if(newChange - change != 0 && newChange >= .05) {
nickles = (int)(newChange/.05);
newChange = (change -(dollars + (quarters * .25) + (dimes * .10) + (nickles * .05))); //newchange is less than .05 so skip
}
if(newChange - change != 0 && newChange >= .01) {
pennies = (int)(newChange/.01); //pennies = 3
newChange = (change -(dollars + (quarters * .25) + (dimes * .10) + (nickles * .05) + (pennies * .01))); //newchange (4.73 - (4 + (2*.25) + (2 .10) + (3*.03))) = 0
}
System.out.println("Dollars: " + dollars);
System.out.println("Quarters: " + quarters);
System.out.println("Dimes " + dimes);
System.out.println("Nickles " + nickles);
System.out.println("Pennies " + pennies);
System.out.println("Total change due: " + change);
}
}
}
我知道有很多人会遇到这样的错误,我已经查看了所有这些错误以找到解决方案,但是没有一个与我遇到的问题相同。
答案 0 :(得分:1)
我认为问题在于:
`newChange = change;
if (activity.Type == ActivityTypes.Message)
{
Activity typing = activity.CreateReply(null);
typing.ServiceUrl = activity.ServiceUrl; //bug in ms bot framework? otherwise service URL is null
typing.Type = ActivityTypes.Typing;
ConnectorClient connector = new ConnectorClient(new Uri(typing.ServiceUrl));
await connector.Conversations.SendToConversationAsync(typing);
//do the actual bot's work here
如果将newChange设置为更改,则newChange-change将始终为0。 因此,您所有的if语句都将评估为false。
对于精度问题: 一个简单的解决方案是将输入乘以100并使用整数。想想处理美分而不是美元; - )
答案 1 :(得分:0)
你的问题在于这项任务:
newChange = change;
遵循这些比较:
if ((newChange - change) != 0 && newChange >= .25)
if (newChange - change != 0 && newChange >= .10)
etc...
您初始化newChange = change
,因此newChange - change
将始终等于零,并且您的所有if
块都将被跳过。
还有一些说明:
- 使用IDE的调试模式。您可以设置断点并在程序执行每一行时查看变量的值。 Java有很棒的调试(包括远程调试)。以下是您的程序在我的IDE(Eclipse Neon)中的外观:
- 全功能的Java IDE(最重要的两个是Eclipse和IntelliJ,虽然NetBeans在我的办公室至少有一位奉献者)利用了编译时类型安全,调试和Java约定的许多功能。您可以通过单个操作在整个应用程序中重命名变量或方法,您可以查看您尝试调用的方法是否存在,您甚至可以调用尚不存在的方法,并让IDE将其存根。所有这些都是可能的,因为IDE在编写代码时会不断地在后台编译代码,因此它知道每个地方都使用了类,变量或方法。调试允许我在你的代码中找到错误(我没骗你)10秒。这就是我们为企业级应用程序编写Java的原因!
- 使用Double和Integer对象而不是基本类型double和int,并使用比较.equals()
。在面向对象的世界中,我们倾向于从比较本身中抽象出比较的实现。考虑这个例子:
Double first = 3.5;
Double second = 3.5;
boolean equal = (first == second); // false
在此示例中,Java将指向first
和second
的指针进行比较,指向内存中的不同位置(因为每个变量在内存中分配了自己的空间first
和{ {1}}只是对这些位置的引用)。
这个重构在所有情况下都会有预期的行为:
second
Double类的作者已经实现了Double first = 3.5;
Double second = 3.5;
boolean equal = first.equals(second); // true
方法,该方法确保比较值是值,而不是引用。这是OO编程的另一个优势;您可以.equals()
使用默认的@Override
方法,并根据您想要的任何条件实施自己的方法。例如,如果您希望基于其中一个或两个字段将两个类实例视为相等,则这非常有用。在你的情况下,使用.equals()
原语,使用double
当然并不重要,但这是一个很好的习惯,或者你会遇到.equals()
类和其他人的惊喜。
答案 2 :(得分:0)
我已经更正了您的代码。
import java.util.Scanner;
public class ChangeClient {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int dollars;
int quarters;
int dimes;
int nickles;
int pennies;
double change;
double newChange;//no need of newChange
System.out.println("How much was it? ");
double cost = kb.nextDouble();
System.out.println("What did you pay with? ");
double payment = kb.nextDouble();
if(payment-cost == 0) {
change = 0.0;
}
else {
change = payment - cost; //4.73
if(change >= 1) {
dollars = (int)(change/1);//dollars = 4
change = (change - dollars);// change = .73
System.out.println("Dollars: " + dollars);
}
if(change >= .25) {
quarters = (int)(change/.25); //quarters = 2
change = (change - quarters*.25); //change = .73-2*.25 = .23
System.out.println("Quarters: " + quarters);
}
if(change >= .10){
dimes = (int)(change/.10); //dimes = 2
change = (change -dimes * .10); //change = .23-2*.10 = .03
System.out.println("Dimes " + dimes);
}
if(change >= .05) {
nickles = (int)(change/.05);
change = (change -nickles * .05); //change is less than .05 so skip
System.out.println("Nickles " + nickles);
}
if(change >= .01) {
pennies = (int)(change/.01); //pennies = 3
change = (int)(change -pennies * .01); //change = .03 - 3*.01 = 0
System.out.println("Pennies " + pennies);
System.out.println("Total change due: " + change);
}
}
}
}
你使用过的newChange是错误的,正如其他人指出的那样,你甚至不需要它。如果你经过我的更正,我已经使用了变化本身来贯穿整个过程。希望这会有所帮助。