使用Java更改计算器

时间:2019-04-09 18:24:01

标签: java calculator calc

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

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

4 个答案:

答案 0 :(得分:2)

将此作为您在Main中的第二行:

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

这是因为NumberOfMoney * 100114.999999999,所以(int)(NumberOfMoney * 100)114。通常,您应注意不要完全相信doublefloat变量的值。

答案 1 :(得分:2)

这里的问题是,双精度不如某些人可能使您相信的那么精确。在您的代码中,问题取决于

int NumberOfCoins = (int)NumberOfMoney * 100;

此操作的输出为114.999999999 ... 这里有2个选项,您可以使用Math.round进行四舍五入,也可以使用更精确但更慢的另一种类型,例如BigDecimal

如果需要该精度,可以使用BigDecimal,但是BigDecimal上不存在诸如+,-,/*之类的基本运算符,但是可以使用其方法add, multiply, substract等。

更新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的2个组成部分。第一个成分是美元值,第二个成分是美分。

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);

答案 2 :(得分:1)

更改您的int NumberOfCoins = (int)(NumberOfMoney * 100);  到int NumberOfCoins = (int)(Math.round(NumberOfMoney * 100));

正如其他同行所提到的,在处理货币时不能真正信任double和float,值得一读Why not use Double or Float to represent currency?

答案 3 :(得分:1)

您看到的错误与您没有遵循第3条说明以避免类型转换有关。

在一些地方,您可以执行以下操作:

int NumberOfCoins = (int)(NumberOfMoney * 100);

那是强制转换,在intdouble之间强制转换会导致您看到的舍入错误。您可以通过四舍五入的方式解决此问题。

但是,我认为您会很好地遵循您的第一条说明:

1) Isolate both the dollars and cents components of the original input string into separate sub strings.

然后,您将处理整数,并且可以更清晰地进行计算。