提问者:小点点

使用Java更改计算器


我需要创建一个程序,可以以最有效的方式计算变化。例如。3个季度而不是75便士。它只有一美元钞票,25美分,一角硬币等。然而,我需要遵循一些规则。

1)将原始输入字符串的美元和美分成分隔离为单独的子字符串。

2) 使用 Integer 实用程序类将这两个子字符串解析为原始整数值。

3) 你不能在工作中使用任何打字。

4)彻底测试以确保不存在舍入误差。

代码是我最初所做的,但我总是为某些值节省一分钱

public class ChangeCalculator
{
public static void Main (String args[]){
    double NumberOfMoney = Double.parseDouble(args [0]);
    int NumberOfCoins = (int)(NumberOfMoney * 100);

    System.out.println("Amount of Money: " + NumberOfMoney + "\n");

    int NumberOfDollars = (int)(NumberOfCoins/100);
    NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;
    System.out.println("Dollars: " + NumberOfDollars);

    int NumberOfQuarters = (int)(NumberOfCoins/25);
    NumberOfCoins = NumberOfCoins - 25 * NumberOfQuarters;
    System.out.println("Quarters: " + NumberOfQuarters);

    int NumberOfDimes = (int)(NumberOfCoins/10);
    NumberOfCoins = NumberOfCoins - 10 * NumberOfDimes;
    System.out.println("Dimes: " + NumberOfDimes);

    int NumberOfNickels = (int)(NumberOfCoins/5);
    NumberOfCoins = NumberOfCoins - 5 * NumberOfNickels;
    System.out.println("Nickels: " + NumberOfNickels);

    int NumberOfPennies = (int)(NumberOfCoins/1);
    NumberOfCoins = NumberOfCoins - 1 * NumberOfPennies;
    System.out.println("Pennies: " + NumberOfPennies);
}
}

输入1.15美元应该输出美元:1四分之一:0角币:1镍:1便士:0但它输出美元:1四分之一:0角币:1镍:0便士:4


共3个答案

匿名用户

将此作为Main中的第二行:

int NumberOfCoins = (int)Math.round(NumberOfMoney * 100);

原因是 NumberOfMoney * 100 是 114.999999999,因此 (int)(NumberOfMoney * 100) 是 114通常,您应该注意不要信任双精度变量和浮点变量的值是精确的。

匿名用户

这里的问题是,替身并不像某些人让你相信的那样精确。在您的代码中,问题取决于

int NumberOfCoins=(int)NumberOfMoney*100

由于此操作的输出为 114.999999999...这里有 2 个选项,您可以使用 Math.round对操作进行舍入,也可以使用其他更精确但更慢的类型,如 BigDecimal

如果你想要这个精度,你可以使用BigDecimal 但是像,-,/*这样的基本运算符在BigDecimal 上不存在,但你可以使用他们的方法加、乘、减等。

更新 1:
代码审查
理想情况下,变量的命名应以小写开头,然后是以下所有单词,开头为大写字母。 例如。

NumberOfMoney 应该是 numberOfMoney NumberOfCoins
应该是 numberOfCoins 名称可以改进,但目前还可以。

如果你将一个 int 除以另一个 int,最终值将始终是一个 int,没有必要强制转换它。
例如

//The following statements are equal
int NumberOfDollars = (int)(NumberOfCoins/100);
int NumberOfDollars = NumberOfCoins / 100;

此操作过于复杂,您可以将其简化

//from
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;

//to
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins % 100;

更新2:
根据您发布的规则,您没有遵守规则1、2和3。对于规则1,它要求你分离字符串的两个组成部分。第一个组件是美元值,第二个是美分值。

String amountValue = "1.15";
String dollaralue = "1" // you need to figure out how to do this.
String centValue = "15" // same

对于规则 2,请查看 Integer 的文档,特别是 parseInt。

对于规则 3,这是类型转换 int NumberOfCoins = (int)(NumberOfMoney * 100);

匿名用户

更改您的int NumberOfCoins=(int)(NumberOfMoney*100)toint NumberOfCoins=(int)(数学舍入(NumberOfMoney*100))

正如其他同行所提到的,在处理货币时,双倍和浮点不能真正信任,值得一读为什么不使用双倍或浮点来表示货币?